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


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

    帖子链接

    一种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结合起来):
         主线程负责游戏逻辑;
         准备线程负责渲染物件的剔除和排序,生成渲染指令列表;
         渲染线程负责执行渲染指令;

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

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

  • 相关阅读:
    火币交易细则
    期货基础知识(竞价,定价,保证金计算)
    期货开平,多开,空开,多平,空平
    最优风险资产组合
    为什么不要把鸡蛋放在同一个篮子里?
    Linux shell 自定义函数
    Linux shell for while 循环
    shell 脚本编写 if else then
    linux任务前后台执行
    Mac 破解Navicat Premium Mac12
  • 原文地址:https://www.cnblogs.com/oilcode/p/8340298.html
Copyright © 2020-2023  润新知