[游戲開發]對多線程渲染方案的想法


最近看了幾篇關於多線程渲染的帖子,思考了一番,把我的想法總結如下。

帖子鏈接

一種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結合起來):
     主線程負責游戲邏輯;
     准備線程負責渲染物件的剔除和排序,生成渲染指令列表;
     渲染線程負責執行渲染指令;

 

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

我還在學習中,請大家多提意見。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM