从零开始的跨平台渲染引擎(零)——基础架构分析与设计
本文同时发布于本人的知乎专栏:https://zhuanlan.zhihu.com/p/403395505
前言
近几年我的工作主要集中在渲染引擎方面。随着工作时间的增长,接触和学习到的相关知识也逐渐增多,并且有着渐渐变杂的趋势。我也想着我所掌握的对相关知识进行总结,将这些知识串联起来,形成体系。于是,从本篇文章开始,我打算从零开始,一步步搭建一个跨平台的渲染引擎,并就着代码逐步总结。
本篇文章将对跨平台渲染引擎做了简要的需求分析,以及基础架构的简要设计。
需求分析
- 跨平台:需要符合“一次编写,随处运行”的主旨;在现在初始阶段,首先选择移动端的两大主流平台Android和iOS来实现,后续会考虑适配Windows、WASM。(MacOS和iOS的实现比较接近,可以在完成iOS端的同时进行适配)
- 嵌入式:非独立运行的应用,由其他应用以控件的方式将引擎嵌入;
- 提供脚本运行时环境:对上层开发者(如游戏开发者等)提供脚本接口,如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系统中,存在两种控件可以满足自定义渲染能力,分别是:SufaceView
和TextureView
。
SurfaceView
和TextureView
都继承于View
,可以作为普通的View
嵌入到视图层次结构中。但和普通的View
区别在于,他们拥有自己独立的Surface
。而这个Surface
就是我们引擎渲染绘制的载体。这两种View
的区别在于,SurfaceView
会在SurfaceFlinger
中开启一个独立的Layer来绘制。而TextureView
则和DecoView
处于同一个Layer中,所以画面更新是和视图结构同步进行的。在实际使用中,则需要根据实际情况来选择其中一个View
来作为视图载体。
Surface
在Android的EGL环境中可以通过ANativeWindow_fromSurface
创建ANativeWindow
。并在此window
基础上,创建EGLSurface
和EGLContext
,作为OpenGL的绘制环境。
iOS
在iOS平台上,直接继承UIView
即可,只需要在类型实现中添加:
+ (Class)layerClass {return [CAEAGLLayer class];
}
用于告诉系统当前的View
的Layer
将作为OpenGL的绘制层。执行下列代码,将此Layer绑定到渲染线程的EAGLContext
上。
[EAGLContext setCurrentContext:context];
// ...
[context renderbufferStorage:GL_RENDERBUFFERfromDrawable:layer];
脚本运行时
跨平台引擎的脚本语言,较常用的是JavaScript和Lua。在脚本语言的选择问题上,这里选择使用JavaScript。原因有一下几点:
- Lua更容易上手,但是JavaScript则拥有更大的用户基数和完善的生态环境;
- JavaScirpt有TypeScript这个超集,开发效率更高;
- JS是Web端的原生语言,在向Web端适配时更容易;
- 在iOS平台上,JS可以利用其内置的JavaScriptCore实现JIT。
主流的JavaScript引擎主要有V8、JavaScriptCore以及前两年由Fabrice Bellard大神写出的QuickJs,这几种JS引擎各有优劣。可以从一下几个角度来对各种引擎考量:
- 性能
- 体积
- 语法支持度
- 调试便捷性
- 应用市场平台规范
此处可参考文章:
从零开始的跨平台渲染引擎(零)——基础架构分析与设计相关推荐
- opengl游戏引擎源码_跨平台渲染引擎之路:拨云见日
前言 最近在工作中越来越多地接触到一些3D以及相比常见特性更酷炫的效果,因此萌发了想要自己从0开始打造一个渲染引擎的念头,一方面是为了更好地实现公司业务的需求,另一方面则是可以学到整个渲染流水线上的方 ...
- 跨平台渲染引擎之路:拨云见日
跨平台渲染引擎之路:拨云见日 前言 从问题出发 启程 渲染引擎的技能树 3D引擎着色方式的演化史 Rendering Path Forward rendering Deferred rendering ...
- 启蒙之路 | 跨平台渲染引擎之路:拨云见日
本文已获得作者授权,原文作者:格子林ll 原文链接:https://zhuanlan.zhihu.com/p/58817407 前言 最近在工作中越来越多地接触到一些3D以及相比常见特性更酷炫的效果, ...
- 高性能跨平台渲染引擎系列一: 跨平台渲染引擎简介
引言: 一直工作比较忙,很久就想写点东西做个备忘,拖延至今.本系列也期望督促自己坚持记录分享,文中如有笔误或者理解偏差,欢迎各位指正交流.也期望未来基于该系列文章的相关代码同步到git上,最终完成一款 ...
- b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释
b2c项目基础架构分析(一)b2c 大型站点方案简述 已补充名词解释 我最近一直在找适合将来用于公司大型bs,b2b b2c的基础架构. 实际情况是要建立一个bs架构b2b.b2c的网站,当然还包括w ...
- b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释
b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释 继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更 ...
- pass基础架构分析
pass基础架构分析 Relay 和 TVM IR,包含一系列优化passes,可提高模型的性能指标,如平均推理,内存占用,或特定设备的功耗.有一套标准优化,及特定机器学习的优化,包括常量折叠,死代码 ...
- 零基础能学好UI设计吗
UI设计在最近几年的发展前景是有目共睹的,越来越多的企业注重用户体验,而UI设计在这一方面是起着非常重要位置的,如今很多人都想要学习UI设计,那么零基础能学好UI设计吗?我们来看看下面的详细介绍. 零 ...
- 零基础可以学好UI设计吗
随着UI设计行业的不断扩大发展,很多人都想要学习UI设计技术,但有很多同学都是零基础,想知道零基础可以学好UI设计吗?我们来看看下面的详细介绍就知道了. 零基础可以学好UI设计吗? 如果零基础自己学习 ...
最新文章
- 一维码EAN 8简介及其解码实现(zxing-cpp)
- 我看过的C#方面的好文章
- OpenCV3实现人脸识别(三)——训练与识别自己的人脸数据
- 人工智能过于发达可能将后患无穷
- python中list的意思_list在python中是什么意思
- 阿里腾讯前端一面小结
- Kaggle入门——房价预测
- CentOS 8安装Redis的两种方式
- form表单提交回调函数
- C#之生成树形菜单数据
- Django中应用celery
- 《码出高效:Java 开发手册》技术笔记
- python自动聊天机器人_Python实现微信聊天机器人
- pos机属于计算机系统吗,什么是POS系统
- 微信扫码支付开发流程
- git之ssh与https地址之间的切换、设置免密码访问服务器、remote、set-url、config、global、credential、helper、store、cache、origin
- 探索肠道细菌的营养偏好
- 【Cherno的OpenGL视频】Vertex buffers and drawing a triangle in OpenGL
- 多屏互动之Windows与Mac下的非自带的远程桌面应用
- npm安装vue,在vue/dist目录下没有产生vue.js文件