[游戏开发]对多线程渲染方案的想法

最近看了几篇关于多线程渲染的帖子,思考了一番,把我的想法总结如下。

帖子链接

一种3D引擎的多线程设计方案

3D引擎多线程:渲染与逻辑分离

---------------------------------------------------------------------------------------------------------------

模块1,游戏逻辑:
模型A向正前方移动了1米,为模型A计算最新的 WorldMatrix 
UI进度条控件进度增长了1%,为UI进度条计算最新的窗口矩形 WindowRect 
 
 
模块2,生成渲染指令( Commond Buffer ):
模型A渲染指令 { WorldMatrix, CameraViewMatrix, CameraProjectionMatrix, VertexBuffer, IndexBuffer, Texture, Shader }
UI进度条渲染指令 { WindowRect, UICameraViewMatrix, UICameraProjectionMatrix, Texture, Shader }
 
 
模块3,GPU执行渲染指令:
向shader中传递数据,DrawIndexed
 
---------------------------------------------------------------------------------------------------------------
多线程渲染方案A:
把模块1和模块2放到主线程,把模块3放到渲染线程。
主线程和渲染线程需要交换的数据是渲染指令列表 { 模型A渲染指令,UI进度条渲染指令 }
主线程生产渲染指令列表,渲染线程消费渲染指令列表。
要想不使用线程锁,那么要有3份渲染指令列表,
主线程使用一份,起个名字叫做X,用于填充新渲染指令,
渲染线程使用一份,起个名字叫做Y,用于绘制,
还有一份,起个名字叫做Z,用于中转数据。
主线程把X填充完毕后,把X用作中转数据,把Z拿走,用于填充新渲染指令。
渲染线程发现X是新的渲染指令列表,就把Y丢开,拿走X,用于绘制。
 
 
多线程渲染方案B:
把模块1放到主线程,把模块2和模块3放到渲染线程。
主线程和渲染线程需要交换的数据是 模型A的WorldMatrix ,UI进度条的WindowRect 。
主线程生成 模型A的WorldMatrix ,UI进度条的WindowRect 。
渲染线程收集  模型A的WorldMatrix ,UI进度条的WindowRect ,生成渲染指令列表,然后绘制。
要想不使用线程锁,那么模型A要维护三份WorldMatrix,UI进度条要维护三份WindowRect。
 
 
两种方案相比较:
1,A比B逻辑简单。B方案中,每个模型要维护三份渲染相关的数据,每个UI控件要维护三份渲染相关的数据。
2,游戏Loading过程中,A方案的画面是静止不动的,而B方案可以看到进度条在增长。
3,A方案中,主线程的计算量非常大,要做的事情有:更新逻辑,渲染物件的剔除和排序,生成渲染指令列表。
      B方案中,把“渲染物件的剔除和排序,生成渲染指令列表”这两步放到了渲染线程。
     主线程和渲染线程,谁会成为帧数的瓶颈?
4,B方案,可以扩展成3个线程(实际上就是方案A和方案B结合起来):
     主线程负责游戏逻辑;
     准备线程负责渲染物件的剔除和排序,生成渲染指令列表;
     渲染线程负责执行渲染指令;

 ---------------------------------------------------------------------------------------------------------------

我还在学习中,请大家多提意见。

原文地址:https://www.cnblogs.com/oilcode/p/8340298.html