主线程渲染线程主线程渲染线程PPT幻灯片.ppt_第1页
主线程渲染线程主线程渲染线程PPT幻灯片.ppt_第2页
主线程渲染线程主线程渲染线程PPT幻灯片.ppt_第3页
主线程渲染线程主线程渲染线程PPT幻灯片.ppt_第4页
主线程渲染线程主线程渲染线程PPT幻灯片.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

多线程渲染解决方案分享,Frankan(安柏霖),1,多线程渲染背景,2,3,多线程渲染,在PC机尤其是console上面的多核心(主要是2核)普及之后的标配做法主线程做第n+1帧的更新渲染线程渲染第n帧更好的利用了多核计算,比单线程有%60到%80的性能提升TheFuture:会进一步并行化更多核心普及可以并行创建送往GPU的commandbuffer(dx11以及console),4,多线程的邪恶,初期给你一个甜枣,后期猛扇耳光简单实现比较容易性能提升很明显:渲染和逻辑cpu端耗时相当的情况下,开多线程之后性能会提升:%60+但是在长期的开发之后,缺乏整理重构的情况下,各种凌乱,bug多且难查原因:让工程变得更大更复杂增加数据和计算模型的规模和复杂度“controlthecomplexityistheessenceofcomputerprogramming”Kernighan在大型项目里尤其凸显问题重现率低导致debug效率低高重现率的问题都不是问题解决:把视线移到多线程带来的复杂度上面系统化的解决方案,5,mPosition,mPosition,TranslationMatrix,UpdateFunction,TranslationMatrix,object,Update,Render,6,单线程渲染,主线程,mPosition,TranslationMatrix,7,多线程渲染,当前位置,前一帧位置,主线程,渲染线程,两线程并行运行,render,天涯明月刀的多线程渲染,GraphicAsyncObject处理数据的异步比如object的同步信息CommandBuffer处理事件类的异步比如一些编辑器里的点选的command根据实际情况可以进行灵活的扩展,8,9,DoubleBuffer,每一个object里面两套数据每帧两套数据角色互换用FrameIndex来区分主线程和渲染线程该使用哪一个,SourcemPosition,ClonemPosition,SourcemPosition,ClonemPosition,主线程,渲染线程,主线程,渲染线程,第n帧,第n+1帧,10,DoubleBuffer,+实现简单+效率比较好内存消耗大,内存效率-相对RingBuffer减少插入删除,效率+-内存消耗大死穴,11,Dangerous?,ClassGraphicInstancePublic:RenderStatemRenderState;Vector3mAsyncPos2;/多线程异步的数据QSMeshInstance*mOwner;QSMaterialResource*mMaterial;QSTransformmWorldTransform;QSTransformmlocalTransform;QSBoundmLocalBound;QSBoundmWorldBound;QSSubGeometry*mGeometry;,12,Dangerous?,13,Dangerous?,14,GraphicAsyncObject,classENGINE_APIQSWaterComponent:publicQSEntityComponentprivate:/configQSNormalMapWaterConfigmNormMapConfig;/graphicobjGraphicAsyncObjectHandlemWaterHandle;/watergridvisibilityinformationeastl:vectormVisibilityData;QSVec2s32mVisSecNum;QSVec3fmAlignPos;eastl:vectormVisTexRes;/flagtoavoidhighfrequencyupdateboolmVisInfoDirty;f64mVisInfoDirtyTimeStamp;boolmInPostLoad;,15,GraphicAsyncObject,voidQSWaterComponent:UpdateWaterVisToGraphicAynscObj()WaterGraphicAsyncObj,16,主线程向RingBuffer加command渲染线程取command执行,CommandRingBuffer,主线程,渲染线程,mPosition,TranslationMatrix,17,CommandRingBuffer,渲染线程执行Command,mPosition,TranslationMatrix,Update函数指针,mPosition,数据副本,主线程加入command,18,CommandRingBuffer,CommandRingBuffer主线程向CmdBuffer插入Command:函数指针,数据渲染线程取出command,执行:函数(数据);优缺点+很酷-游戏业刚开始流行多线程的时候,UE3的解决方案+内存消耗达到最小-只有活动object才会造成额外的内存消耗灵活性+扩展性好-使用起来相对doublebuffer等更麻烦,比较容易搞砸对于用户来讲还是在“处理并行事件”复杂度还是比较高效率和灵活性上提高显著,但是在系统化降低复杂度上还比较有限,19,CommandBuffer应用实例逐像素pick,20,RenderCommand(pos,CallBackFunc),GPUPerpixelPickRender,ReadPickResultFromGPU,CallBackFuncMainThreadCommand(result),GraphicInstanceHandle.ModifyOriginal().mHighLight=true;,Cmd-Exe(),渲染highlight模型,0,1,2,3,主线程,渲染线程,21,GraphicAsyncObject,22,GraphicAsyncObject,Engineering向多种技术的综合体力求去“一石多鸟”的去尽可能好的解决尽可能多的问题解决多线程渲染中的异步数据处理,但不限于此易于使用,不易出错使用得当的话,很大程度上提升效率,23,GraphicAsyncObject,使用方式通过宏方便的给一个class加上实现,使用的主要工作:,/headerclassAsyncObj:publicGraphicAsyncObjectDeclareGraphicAsyncObject(AsyncObj);u8mHighLight:1;/cppDefineGraphicAsyncObject(AsyncObj);/useAsyncObj,QSGame的GraphicAsyncObject,每一个类型会有一个static的manager,统一管理这一类的所有asyncobject里面有两个list:OriginalList;ClassGraphicInstance:publicGraphicAsyncObjectPublic:GraphicAsyncObjectHandlemBoneData;GraphicAsyncObjectHandlegraphInst;graphInst.ReadOriginal().mBoneData.ModifyOriginalNoCopy()=xxxx;,28,GraphicAsyncObject实现,GraphicAsyncObjectHandle的嵌套:残影应用,29,classStateOpenData;u8mHighLight:1;,classStateLocalData;MaterialStatemMaterialState;RenderStateIdmRenderStateId;ShaderIdmShaderId;PixelShaderConstantmConstant;,OpenData,LocalData,LocalData,LocalData,GraphicAsyncObject:Optional:GraphicAsyncObject可以带localdata,也可以不带只有渲染线程才能访问,仿佛是renderthread的private成员变量一样Handle.ReadCopy().GetLocalData(localDataPtr);给GraphicAsyncObject的每一个实例提供了存放专有数据的一个地方会有更新函数来根据GraphicAsyncObject来更新localdata更新函数根据需要来自己定义只有在GraphicAsyncObject被修改(ModifyOriginal()/ModifyOriginalNoCopy())的时候,更新函数才会被调用,触发型。某种意义上可以把GraphicAsyncObject理解为是参数,LocalData才是真正的被使用的数据LocalData的存在对GraphicAsyncObject的设计影响巨大,30,31,LocalData,每帧更新LocalData的时候是一个类一个类统一进行,效率更高(相比commandbuffer),32,LocalDataInPractice,classQSGraphicInstanceLocalData:publicGraphicLocalData/renderstateidRenderStateIdmLightingWithoutZPassRsId;RenderStateIdmLightingWithZPassRsId;/*BITFIELD*/shadowBITFIELDmVisibleShadow:1;BITFIELDmVisibleShadowInfoAssigned:1;/cachedstateflagBITFIELDmCastShadow:1;/basedonlotsofinformationtodecideifitcastsshadow;,33,LocalDataInPractice,物件是否castshadowCastShadowflag是否是透明的是否是collision数据是否是BackGround数据是否隐形一种处理就是在渲染shadow的时候写很长的if,34,LocalDataInPractice,VoidUpdateLocalData(constGraphicInstanceif(localData.mCastShadow)/xxx,35,GraphicAsyncObjectinpractice,偏向于数据的异步解决方案,和commandbuffer各有千秋,根据各个情况采用最优的方式只存放必要的数据,不要冗余要考虑是否需要copy的情况,根据效率需要进行区分,使用嵌套等方式进行区分使用bitfield,hash等方式,结合local

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论