默认单线程渲染模式
在默认的单线程渲染模式中,整个渲染流程都在一个线程上执行,即MainThread。MainThread上会串行交替执行逻辑任务与渲染任务(逻辑任务主要负责驱动游戏世界逻辑,生产渲染原始数据;渲染任务会执行渲染管线逻辑并将高层的渲染逻辑拆分为标准的RHI命令块,并驱动GPU硬件渲染当前帧的画面)。
并行渲染
由于渲染任务需要等待使用逻辑任务的计算结果,因而在时序上会排在逻辑任务之后执行。渲染任务的执行依赖于当前帧逻辑任务的计算结果,但逻辑任务往往不依赖渲染任务,因而团结引擎在并行渲染模式下会开启一个专门负责处理渲染任务的线程(名为RenderThread),并将所有的渲染任务从原本的MainThread迁移至RenderThread,进而使得留在MainThread中的逻辑任务能够连续且高效的执行。开启并行渲染后的理想状态下,主线程和渲染线程会被分配到CPU的不同核心上,并行的执行各自的任务。相比于原本的单线程渲染模式,并行渲染能够在相同时间内完成更多帧的计算任务。
数据竞争问题处理
为避免多线程情境下的Data Race问题,并行渲染会额外为渲染任务生成Proxy Data(类似于Game Data的轻量级副本)。在程序运行过程中,渲染任务直接访问的是Proxy Data,从而避开Data Race问题。生成Proxy Data会带来额外的计算成本与内存成本,但相比于开启并行渲染所带来的性能提升,这部分成本完全可控且收益远大于损耗。
由于目前小游戏平台最多支持双线程,而MainThread又是必选项,因而并行渲染功能(即Parallel Rendering)会与Multithreaded Rendering功能直接冲突,只能二选一。当ParallelRendering与Multithreaded Rendering选项同时被勾选时,由于并行渲染的优先级高于多线程渲染,故游戏打包时会选择并行渲染模式。