本文同时发布于本人的知乎专栏:https://zhuanlan.zhihu.com/p/403395505

前言

近几年我的工作主要集中在渲染引擎方面。随着工作时间的增长,接触和学习到的相关知识也逐渐增多,并且有着渐渐变杂的趋势。我也想着我所掌握的对相关知识进行总结,将这些知识串联起来,形成体系。于是,从本篇文章开始,我打算从零开始,一步步搭建一个跨平台的渲染引擎,并就着代码逐步总结。

本篇文章将对跨平台渲染引擎做了简要的需求分析,以及基础架构的简要设计。

需求分析

  1. 跨平台:需要符合“一次编写,随处运行”的主旨;在现在初始阶段,首先选择移动端的两大主流平台Android和iOS来实现,后续会考虑适配Windows、WASM。(MacOS和iOS的实现比较接近,可以在完成iOS端的同时进行适配)
  2. 嵌入式:非独立运行的应用,由其他应用以控件的方式将引擎嵌入;
  3. 提供脚本运行时环境:对上层开发者(如游戏开发者等)提供脚本接口,如JavaScript或Lua等。

技术分析

有了大概的引擎需求,现在我们开始分析一下需要什么样的技术栈来实现这些需求。

整体的技术架构

渲染引擎的整体架构如下图所示:

  • 底层的Platform层对应着各个系统平台,如Android、iOS、Web、Windows等。
  • Container层对应着系统平台容器层。其作用是抹平系统API差异,并使引擎可以运行与各个平台上。
  • Graphic Engine层和Graphic Wrapper层对应着图形引擎及其包装。其作用是底层的图形绘制,以及向上提供绘制接口。图形引擎包括但不限于:OpenGL、Metal、Vulkan等。
  • Script Engine和Runtime Wrapper层对应脚本引擎及其包装。其作用是解析运行脚本,向上提供脚本运行接口及扩展API能力。脚本引擎包括但不限于:V8、JSCore、WASM、QuickJS等。
  • Framework层是引擎的核心层,其作用是物理引擎模拟、Action计算、渲染指令生成等。
  • Export API是向上层开发者提供的API接口。上层开发者可用脚本语言,利用这些API进行业务逻辑开发。

下面对各层进行详细分析。

图形引擎

首先,底层的图形引擎我优先选择使用OpenGL,因为OpenGL在平台的适配性上优势比较明显。尤其在初期版本,搭建引擎整体架构时,需要尽量减少适配性的工作。

当然,现在Metal、Vulkan等引擎也在逐步的代替古老的OpenGL。所以,在后续版本迭代中,会将适配不同的图形引擎。这也是架构中Graphic Wrapper层存在的意义。

OpenGL

OpenGL全称为Open Graphic Library,是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。

OpenGL接口类似C语言函数,但其实是语言独立的。因此,OpenGL会有很多不同语言的绑定,如:Android提供Java和C绑定、iOS提供C绑定,甚至JavaScript绑定的WebGL。OpenGL不仅语言无关,而且平台无关。规范只字未提获得和管理OpenGL上下文相关的内容,而是将这些作为细节交给底层的窗口系统。

针对手机、PDA和游戏主机等嵌入式设备,Khronos组织又从OpenGL中裁剪定制了OpenGL ES(全称为OpenGL for Embedded Systems)。其中OpenGL ES 2.0是参照 OpenGL 2.0 规范定义的,引入了对可编程管线的支持。

由于OpenGL依赖于硬件的支持,所以在OpenGL版本选择的考虑中,为了适配较老的硬件机型,这里选择使用OpenGL/OpenGL ES 2.0版本。同时也应该考虑适配3.0版本,以用于后续更新。

Metal

Metal是苹果公司于2014年推出的新的图形引擎,其拥有更高效的图形渲染性能。Metal引擎对软硬件有一些要求,如果使用Metal引擎,要求系统版本不低于iOS 8或MacOS 10.11,硬件则是需要A7芯片以上。

苹果曾在18年的WWDC大会上宣布在MacOS 10.14、iOS 12等版本之后,将逐步废弃OpenGL。虽然当前仍然可以使用OpenGL,不过不再继续更新,并且不推荐使用。所以在后续的适配工作中,也会考虑到在iOS平台上使用Metal等情况。

Vulkan

Vulkan是由Khronos组织在2015年推出的一种高级图形API。Vulkan的设计初衷是为了避免在上层API出现更高的开销。同时,还希望Vulkan成为一个比其他图形API更跨平台的API,它不仅针对高端系统,还针对低端移动设备。

同样的,Vulkan也有最低软硬件要求。软件上,Android 7.0开发者预览版开始,Google在系统平台中添加了对Vulkan的API支持。硬件上,则需要AMD Radeon Software Crimson 版 16.3 及更新版本在 Windows® 7、Window® 8.1、Windows® 10 和 Linux® 中支持基于次世代图形核心架构的以下 AMD APU 和 Radeon™ 显卡。

平台容器控件

平台容器控件用于承载引擎本身,并起到引擎和系统之间的桥梁作用。

Android

在Android系统中,存在两种控件可以满足自定义渲染能力,分别是:SufaceViewTextureView

SurfaceViewTextureView都继承于View,可以作为普通的View嵌入到视图层次结构中。但和普通的View区别在于,他们拥有自己独立的Surface。而这个Surface就是我们引擎渲染绘制的载体。这两种View的区别在于,SurfaceView会在SurfaceFlinger中开启一个独立的Layer来绘制。而TextureView则和DecoView处于同一个Layer中,所以画面更新是和视图结构同步进行的。在实际使用中,则需要根据实际情况来选择其中一个View来作为视图载体。

Surface在Android的EGL环境中可以通过ANativeWindow_fromSurface创建ANativeWindow。并在此window基础上,创建EGLSurfaceEGLContext,作为OpenGL的绘制环境。

iOS

在iOS平台上,直接继承UIView即可,只需要在类型实现中添加:

+ (Class)layerClass {return [CAEAGLLayer class];
}

用于告诉系统当前的ViewLayer将作为OpenGL的绘制层。执行下列代码,将此Layer绑定到渲染线程的EAGLContext上。

[EAGLContext setCurrentContext:context];
// ...
[context renderbufferStorage:GL_RENDERBUFFERfromDrawable:layer];

脚本运行时

跨平台引擎的脚本语言,较常用的是JavaScript和Lua。在脚本语言的选择问题上,这里选择使用JavaScript。原因有一下几点:

  1. Lua更容易上手,但是JavaScript则拥有更大的用户基数和完善的生态环境;
  2. JavaScirpt有TypeScript这个超集,开发效率更高;
  3. JS是Web端的原生语言,在向Web端适配时更容易;
  4. 在iOS平台上,JS可以利用其内置的JavaScriptCore实现JIT。

主流的JavaScript引擎主要有V8、JavaScriptCore以及前两年由Fabrice Bellard大神写出的QuickJs,这几种JS引擎各有优劣。可以从一下几个角度来对各种引擎考量:

  • 性能
  • 体积
  • 语法支持度
  • 调试便捷性
  • 应用市场平台规范

此处可参考文章:

从零开始的跨平台渲染引擎(零)——基础架构分析与设计相关推荐

  1. opengl游戏引擎源码_跨平台渲染引擎之路:拨云见日

    前言 最近在工作中越来越多地接触到一些3D以及相比常见特性更酷炫的效果,因此萌发了想要自己从0开始打造一个渲染引擎的念头,一方面是为了更好地实现公司业务的需求,另一方面则是可以学到整个渲染流水线上的方 ...

  2. 跨平台渲染引擎之路:拨云见日

    跨平台渲染引擎之路:拨云见日 前言 从问题出发 启程 渲染引擎的技能树 3D引擎着色方式的演化史 Rendering Path Forward rendering Deferred rendering ...

  3. 启蒙之路 | 跨平台渲染引擎之路:拨云见日

    本文已获得作者授权,原文作者:格子林ll 原文链接:https://zhuanlan.zhihu.com/p/58817407 前言 最近在工作中越来越多地接触到一些3D以及相比常见特性更酷炫的效果, ...

  4. 高性能跨平台渲染引擎系列一: 跨平台渲染引擎简介

    引言: 一直工作比较忙,很久就想写点东西做个备忘,拖延至今.本系列也期望督促自己坚持记录分享,文中如有笔误或者理解偏差,欢迎各位指正交流.也期望未来基于该系列文章的相关代码同步到git上,最终完成一款 ...

  5. b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释

    b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释 我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括w ...

  6. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...

  7. pass基础架构分析

    pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...

  8. 零基础能学好UI设计吗

    UI设计在最近几年的发展前景是有目共睹的,越来越多的企业注重用户体验,而UI设计在这一方面是起着非常重要位置的,如今很多人都想要学习UI设计,那么零基础能学好UI设计吗?我们来看看下面的详细介绍. 零 ...

  9. 零基础可以学好UI设计吗

    随着UI设计行业的不断扩大发展,很多人都想要学习UI设计技术,但有很多同学都是零基础,想知道零基础可以学好UI设计吗?我们来看看下面的详细介绍就知道了. 零基础可以学好UI设计吗? 如果零基础自己学习 ...

最新文章

  1. 一维码EAN 8简介及其解码实现(zxing-cpp)
  2. 我看过的C#方面的好文章
  3. OpenCV3实现人脸识别(三)——训练与识别自己的人脸数据
  4. 人工智能过于发达可能将后患无穷
  5. python中list的意思_list在python中是什么意思
  6. 阿里腾讯前端一面小结
  7. Kaggle入门——房价预测
  8. CentOS 8安装Redis的两种方式
  9. form表单提交回调函数
  10. C#之生成树形菜单数据
  11. Django中应用celery
  12. 《码出高效:Java 开发手册》技术笔记
  13. python自动聊天机器人_Python实现微信聊天机器人
  14. pos机属于计算机系统吗,什么是POS系统
  15. 微信扫码支付开发流程
  16. git之ssh与https地址之间的切换、设置免密码访问服务器、remote、set-url、config、global、credential、helper、store、cache、origin
  17. 探索肠道细菌的营养偏好
  18. 【Cherno的OpenGL视频】Vertex buffers and drawing a triangle in OpenGL
  19. 多屏互动之Windows与Mac下的非自带的远程桌面应用
  20. npm安装vue,在vue/dist目录下没有产生vue.js文件

热门文章

  1. Uniapp IOS 推送 离线收不到消息解决方案
  2. 写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
  3. virtualbox 与vmware 之为什么我放弃了virualbox
  4. LCD液晶屏和背光源一定要配套吗
  5. 聊聊订单系统的设计?
  6. 世界上10种你可能不知道的事
  7. 谷歌浏览器快捷键整理
  8. C#,图论与图算法,二分图(Bipartite Graph)的霍普克罗夫特-卡普(Hopcroft Karp)最大匹配算法与源程序
  9. 释放企业数据价值,不可缺少这件利器
  10. 编写jsp脚本代码,浏览器无论无何不显示内容 jsp