




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、爱奇艺小游戏跨平台探索和实践高性能的底层渲染引擎为游戏赋能为什么自研渲染内核?做什么?怎么做?自研渲染内核VS浏览器内核跨平台,动态加载性能一般可扩展性一般背靠浏览器大厂,稳定性有保证跨平台,动态加载 性能强劲可扩展性强,可发挥空间大 开发门槛,需要自行保证稳定性Render PipelineJavaScript Game BusinessGame EngineCavnas RenderCavnas RenderCavnas RenderCavnas RenderComposite Service(Backend Effect)Window Adapter ViewPortOn Screen(
2、System Composite)AndroidiOSMacWindowsLinux窗口系统AudioSensorFileWAL(平台隔离抽象层)SocketV8/JavascriptCore实现W3C Canvas 2D和Webgl 标准 、类浏览器的环境跨平台渲染器组件RAL解释器NetworkOpengl ES/Vulkan/Metal/Skia资源管理Timer/VsyncMisc游戏引擎: Cocos Creator/Layabox/Egret/U3DGame Logic and Business三千米俯瞰架构用户逻辑层内核层跨平台渲染器组件 RAL + SLXC: shader l
3、anguage X compilerOpengl ES 2.0/3.0 Protocol with Abstract Objective PSO(Virtual GrContext)Opengl ES 2.0/3.0 APIGoogle Angle(Metal ? Roadmap ?)VirtualRenderContext Over EglContext SLXC CompilerAPI ImplementionGLSL AST and Backend ConvertStatemachine/CmdMSLSPIR-VHlSLOthersRender APIApple MetalVulkanD
4、irectXOthers尚未实现NetWork ACL +Https/WebsocketHttp/HttpsWebsocketDNSICMPNetwork User APIProtocolACL Network LibTCP StreamUDPRaw UDPRaw TCPSelectPollEpollkQueueIocp/acl-dev/aclSystemVirtualRenderContext?隔离性?由于Opengl的驱动的设计,任何时刻同一个线程只能挂接一个Opengl 上下文。一个上下文包含了当前所有的Opengl状态机的状态,也就是 一个隔离。但是W3C标准中允许同时拥有多个Canv
5、as,每一个Canvas的状态都需 要互相隔离。所以内核不得不时刻“盯着”Canvas API的调用,并实时协 助Canvas切换不同的Opengl的上线文?Raw EglContext并不是所有的硬件都支 持多个EGLContext(嵌 入式设备,移动设备可 能性比较小)EGLContext切换 CommandBuffer的处理 是未定义行为隐藏的性能惩罚EGL不同平台驱动存在诸 多BUG需要规避VirtualRenderContext 模拟隔离性GL State Capture 150+ glGet*API InvokeGL State Restore 150+ glSet*API Inv
6、oke性能惩罚 ?性能和F P S 是游戏性和用户体验的基础优化渲染性能是内核的关键和使命性能优化应该从哪里入手?Pipeline并行性化,逻辑与渲染分离,虚拟状态机CommandBuffer 优化 渲染指令重排序异步GPU IO,解决纹理阻塞 只读复合文档,资源打包,瞬间加载渲染Pipeline并行化JavaScript CalcGL Render API JavaScript Calc GL Render API JavaScript Calc GL Render API JavaScript Calc GL Render API运算时间堆积(60Fps/16ms)渲染Pipeline并行
7、化,虚拟GL状态机虚拟GL状态机,Virtual StatemachineGL状态机代理存根Render Command CommitterState Set State Query通过代理存根设计的虚拟状态机,用于减少Pipeline并行后的同步调用。提高Pipeline的并行程度。渲染Pipeline并行化JavaScript CalcGL Render API JavaScript Calc GL Render API JavaScript Calc GL Render API JavaScript Calc GL Render API运算时间堆积(60Fps/16ms)渲染Pipeli
8、ne并行化JavaScript CalcJavaScript Calc JavaScript Calc JavaScript CalcGL Render APIGL Render API GL Render API GL Render APICommand Buffer逻辑线程渲染线程渲染Pipeline并行化JavaScript CalcGL RenderJavaScript CalcGL RenderTimelineVsync 0 Vsync 1渲染Pipeline并行化,渲染与逻辑分离JavaScript CalcGL RenderJavaScript CalcGL RenderTime
9、lineVsync 0 Vsync 1渲染Pipeline并行化,CommandBufferJavaScript CalcJavaScript CalcJavaScript CalcCommand Buffer:Transfer JavaScript CalcJavaScript CalcGL RenderThreadJavaScript线程Command Buffer作为内核传输渲染命令的主动脉,天然的对性能和吞度量有着极高的要求。如果游戏的一帧产生5000个渲染相关的命令(非Drawcall,往往超过这个数字),为了满足 60FPS也就是16ms内完成一帧的渲染。现在希望传递渲染命令的损耗
10、时间不超过2ms(为了把更 多时间留给JavaScript和像素染色),那么Command Buffer的吞度量达到惊人的5000 / 2 * 1000 = 250wQPSCommand Buffer内存复用,减少内 存分配和释放批提交,减少对锁的操 作利用编译器对类的编译会 做内存布局来提前规避序 列化和反序列化时间Placement New构造,减少 参数提交需要做数据拷贝 的性能损失Lock free Wait free规避C+虚函数调用,规避扫描vtable的时间内存对齐,提高CPU寻址性能(Arm必须)优化效果: 1000wQPS+ 350wQPS(MI9+骁龙855测试数据,会随着
11、传递的参数多少和参数占用的内存多少有关系)为何数组的遍历速度比链表要快很多?GPU TileBased/ 桌面GPU和移动GPUGPUTileBased CacheGPU MemoryFrameBuffer的切换会导致TileBased 失效,Cache Miss带来性能惩 罚,需要特别注意。Frame-buffer / TextureTileTile Cache MissGPU Memory渲染指令和RenderVirtualContext优化渲染指令和RenderVirtualContext优化Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canv
12、as 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 1渲染并且依赖Canvas 0的结果渲染指令和RenderVirtualContext优化Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 1渲染并且依赖Canvas 0的结果Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas
13、1渲染并且依赖Canvas 0的结果Context切换Context切换Context切换Context切换Context切换Context切换Context切换上下文的切换,GL指令膨胀多次性能惩罚渲染指令和RenderVirtualContext优化Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 1渲染并且依赖Canvas 0的结果Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canva
14、s 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 1渲染并且依赖Canvas 0的结果Context切换Context切换Context切换Context切换Context切换Context切换Context切换上下文的切换,GL指令膨胀多次性能惩罚渲染指令和RenderVirtualContext优化Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 1渲染并且依赖Canvas 0的结果Canvas 0 渲染Canvas 1 渲染Can
15、vas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 0 渲染Canvas 1 渲染Canvas 1渲染并且依赖Canvas 0的结果Context切换指令重排序减少Context切换带来的性能惩罚异步GPU, IO(主要是纹理数据)GPU 和 CPU有大块的Buffer需要传输的时候(上载和获取纹理),会长时间阻塞硬件Command Buffer。 异步GPU IO利用EGL Context Shared纹理可以共享的特性,异步传递纹理数据。纹理上传,传递纹理,并构建同步点上载纹理,并释放同步点渲染命令渲染命令,通过同步点同步渲染命令与纹理相关的渲染命令渲染命令渲染命令唤醒渲染线程逻辑线程渲染线程异步GPU IO 线程只读复合文档,急速加载问:为什么不采用zip或者rar压缩文件打包? 答:因为得先解压出来然后才能用 只读复合文档,急速加载文件头/检验值/版本信息文件树,meta数据文件1 Meta数据,标记压缩算法文件1 二进制数据文件2Meta数据,标记压缩算法文件2 二进制数据MMap或者内存映射文件校验版本重构文件树读取文件提取内存偏移量和长度对需要解压的文件进行解压获得最终数据Tips:由于复合文档的特殊设计,保证了
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全国脱贫攻坚知识竞赛试题库及答案
- 2025年电工安全操作考试试卷及答案
- 2025建筑施工八大员综合知识考试题库及答案
- 合同法律效力评估考核试卷
- 新建生产吸尘器、家用电器配件、汽车零部件项目环境影响评价报告表
- 2025年成都市锦江区(中小学、幼儿园)教师招聘试题及答案
- 住宅建筑雨水收集与利用系统设计考核试卷
- 儿童玩具行业国际市场风险预警系统构建考核试卷
- 应急响应团队建设与管理考核试卷
- 年产纸盒800万个生产项目沃美生物配套实验室项目报告表
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- 直播眼镜行业现状分析
- 《漏电保护器》课件
- Ovation 系统硬件培训教材
- 15D501 建筑物防雷设施安装
- 彩色多巴胺夏日活动策划PPT模板
- 小学思政课教案(通用10篇)
- 2022年普洱市辅警招聘考试真题
- 万能中国地图模板(可自动设置省份颜色)课件
- 基础化工-石英砂行业深度报告:供需平衡偏紧砂源渐显稀缺-东北证券王小勇-20230227
- GB/T 10752-2005船用钢管对焊接头
评论
0/150
提交评论