2023-06-29 11:55:02 +08:00

2.3 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
UE的多线程渲染 2022-11-23 16:55:20 Rendering

视频:https://www.bilibili.com/video/BV1sP4y117Dg/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290

并行渲染

因为一些平台的RHI指令需要等待驱动层返回才能继续执行所以会使用分离RHI线程的方式来解决。 800

渲染线程会每帧的帧头处等待RHI线程执行结束。

RHI

同时渲染线程会将这些RHI命令都打包在一起以链表的方式发送到RHI线程进行处理。其中FRHICommandListImmediate单例只存在一个只存放立即执行的RHI命令比如LockTextre2D子类的。

多线程翻译RHI指令

  • IRHIComputeContext只有一些ComputeShader相关逻辑。
  • IRHICommandContext继承自IRHIComputeContext其他更多GPU指令。

Command会以链表的方式被构建成CommandBuffer之后加入驱动层的Queue中。

线程同步

  • 前端使用了TaskGraph System来同步主要通过设置Task与Task之间的条件来实现的。
  • 后端使用Barrier、Fence、Semaphore等方法。

MeshDrawCommand的并行过程

RDG并行渲染

并行渲染Debug

  • ByPass
    • r.RHICmdBypass
      • forcerhibypass
  • GRHISupportsRHIThread
    • console variables =>r.metal.IOSRHIThread r.OpenGL.AllowRHIThread r.vulkan.RHIThread
    • -rhithread -norhithread
  • GRHISupportsParallelRHIExecute
    • r.Vulkan.RHIThread >1