52 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
---
 | 
						||
title: UE的多线程渲染
 | 
						||
date: 2022-11-23 16:55:20 
 | 
						||
excerpt: 
 | 
						||
tags: Rendering 
 | 
						||
rating: ⭐⭐
 | 
						||
---
 | 
						||
视频:https://www.bilibili.com/video/BV1sP4y117Dg/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290
 | 
						||
 | 
						||
# 并行渲染
 | 
						||
因为一些平台的RHI指令需要等待驱动层返回才能继续执行,所以会使用分离RHI线程的方式来解决。
 | 
						||

 | 
						||
 | 
						||
渲染线程会每帧的帧头处等待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 |