主线程渲染线程主线程渲染线程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《主线程渲染线程主线程渲染线程课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 主线 渲染 线程 课件
- 资源描述:
-
1、多线程渲染解决方案分享Frankan(安柏霖)多线程渲染背景3多线程渲染在PC机尤其是console上面的多核心(主要是2核)普及之后的标配做法主线程做第n+1帧的更新渲染线程渲染第n帧更好的利用了多核计算,比单线程有%60到%80的性能提升TheFuture:会进一步并行化更多核心普及可以并行创建送往GPU的command buffer(dx11以及console)4 多线程的邪恶初期给你一个甜枣,后期猛扇耳光简单实现比较容易性能提升很明显:渲染和逻辑cpu端耗时相当的情况下,开多线程之后性能会提升:%60+但是在长期的开发之后,缺乏整理重构的情况下,各种凌乱,bug多且难查原因:让工程变得
2、更大更复杂增加数据和计算模型的规模和复杂度“control the complexity is the essence of computer programming”Kernighan在大型项目里尤其凸显问题重现率低导致debug效率低高重现率的问题都不是问题解决:把视线移到多线程带来的复杂度上面系统化的解决方案5mPositionmPositionTranslationMatrixUpdateFunctionTranslationMatrixobjectUpdateRender6单线程渲染updaterender主线程mPositionTranslationMatrix7多线程渲染upda
3、te当前位置当前位置前一帧位置前一帧位置主线程渲染线程两线程并行运行render天涯明月刀 的多线程渲染GraphicAsyncObject处理数据的异步比如object的同步信息CommandBuffer处理事件类的异步比如一些编辑器里的点选的command根据实际情况可以进行灵活的扩展9DoubleBuffer每一个object里面两套数据每帧两套数据角色互换用FrameIndex来区分主线程和渲染线程该使用哪一个SourcemPositionClonemPositionSourcemPositionClonemPosition主线程渲染线程主线程渲染线程第n帧第n+1帧10DoubleB
4、uffer+实现简单+效率比较好内存消耗大,内存效率-相对RingBuffer减少插入删除,效率+-内存消耗大死穴11 Dangerous?Class GraphicInstancePublic:RenderStatemRenderState;Vector3 mAsyncPos2;/多线程异步的数据QSMeshInstance*mOwner;QSMaterialResource*mMaterial;QSTransformmWorldTransform;QSTransformmlocalTransform;QSBoundmLocalBound;QSBoundmWorldBound;QSSubGe
5、ometry*mGeometry;12 Dangerous?13 Dangerous?14 GraphicAsyncObjectclass ENGINE_API QSWaterComponent:public QSEntityComponentprivate:/config QSNormalMapWaterConfigmNormMapConfig;/graphic obj GraphicAsyncObjectHandle mWaterHandle;/water grid visibility information eastl:vector mVisibilityData;QSVec2s32
6、mVisSecNum;QSVec3f mAlignPos;eastl:vector mVisTexRes;/flag to avoid high frequency update bool mVisInfoDirty;f64 mVisInfoDirtyTimeStamp;bool mInPostLoad;15 GraphicAsyncObjectvoid QSWaterComponent:UpdateWaterVisToGraphicAynscObj()WaterGraphicAsyncObj&ref=mWaterHandle.ModifyOriginal();ref.mAlignPos=mA
7、lignPos;ref.mVisibilityData=mVisibilityData;ref.mVisTexRes=mVisTexRes;ref.mVisSecNum=mVisSecNum;16函数指针函数指针+数据数据commandFunc(Data);CommandCommandCommandCommandcommandcommand主线程向RingBuffer加command渲染线程取command执行CommandRingBuffer主线程渲染线程mPositionTranslationMatrix17函数指针函数指针+数据数据commandcommandFunc(DatFunc(D
8、ata);a);commandcommandcommandcommandCommandRingBuffer渲染线程执行CommandmPositionTranslationMatrixUpdate函数指针mPosition数据副本主线程加入command18CommandRingBufferCommandRingBuffer主线程向CmdBuffer插入Command:函数指针,数据渲染线程取出command,执行:函数(数据);优缺点+很酷-游戏业刚开始流行多线程的时候,UE3的解决方案+内存消耗达到最小-只有活动object才会造成额外的内存消耗灵活性+扩展性好-使用起来相对double
9、buffer等更麻烦,比较容易搞砸对于用户来讲还是在“处理并行事件”复杂度还是比较高效率和灵活性上提高显著,但是在系统化降低复杂度上还比较有限19CommandBuffer应用实例逐像素pick20RenderCommand(pos,CallBackFunc)GPUPerpixelPickRenderReadPickResultFromGPUCallBackFuncMainThreadCommand(result)GraphicInstanceHandle.ModifyOriginal().mHighLight=true;Cmd-Exe()渲染highlight模型0123主线程渲染线程21G
10、raphicAsyncObject22 GraphicAsyncObjectEngineering向多种技术的综合体力求去“一石多鸟”的去尽可能好的解决尽可能多的问题解决多线程渲染中的异步数据处理,但不限于此易于使用,不易出错使用得当的话,很大程度上提升效率23GraphicAsyncObject使用方式o 通过宏方便的给一个class加上实现,使用的主要工作:/headerclass AsyncObj:public GraphicAsyncObject DeclareGraphicAsyncObject(AsyncObj);u8 mHighLight:1;/cppDefineGraphicA
展开阅读全文