现代渲染 API 相比于上一代渲染 API,最明显的改变就是去掉渲染上下文(Context)这个中心化的设计,转而使用去中心化的命令队列(CommandQueue)来提供多线程渲染的能力,因此多线程渲染已经成为现代游戏引擎的一项必备内容。
由于个别指令的调用需要耗时较多,导致主线程 CPU 出现等待,以致画面卡顿,这也就是多线程渲染主要解决的问题。为了充分利用现代渲染 API 来解决画面卡顿问题,引擎层面也要实现一套基于多线程的渲染框架,做到逻辑更新和渲染指令提交这两个过程解耦到不同线程,使这两个过程互相之间的影响减到最小。
前文详解了 UE4 的多线程源码,也就是通过 TaskGraph 系统将渲染命令打包成任务提交到渲染线程。
其实多线程渲染框架的思想大体上都差不多,基本上都是主线程生成一系列引擎自定义的渲染命令,并写入渲染队列,渲染线程读取渲染队列里面的渲染命令,通过渲染 API 提交到 GPU。这个流程可以看下图。