观察RenderDoc截帧UE时“Event”代表什么
概要
RenderDoc 的 Event Browser 窗口是观察渲染流程的最基础方式。其中包含着绘制出当前这一帧按时间顺序所经历的事件(Event)。
本篇想弄明白在截帧UE的时候,这些“Event”代表什么,或者说来源是什么。
Event代表什么
官方文档这样描述“Event”:
By default the events which are listed here are those known as actions. Draws and dispatches are examples of actions, but also events that modify resources like clears and copies. State setting and other CPU-update calls like Maps are not included and are available in the API Calls view (see below).
默认情况下,此处列出的事件又称为“操作”。draw 和 dispatch 都算是操作,但也有修改资源的事件,如 clear 和 copy。状态设置和其他 CPU 的调用(如 Maps)不包括在内,它们可在 API Inspector 视图中找到。
很显然,图形API,比如最常用DrawIndexedInstanced
算是一个Event。
我这里UE用的是D3D12,他所有的图形API可以在这里全部看到:ID3D12GraphicsCommandList (d3d12.h) - Win32 apps | Microsoft Learn
但不光如此,截帧UE会看到很多事件的名字并非是图形API,并且有层级关系,这是在哪指定的呢?
通过搜索代码,我发现是通过 RDG_EVENT_SCOPE
宏来指定的。
RDG_EVENT_SCOPE
在一个作用域(即代码的一个花括号{}
范围)发挥作用,这个作用域内的event都会显示为其子项。
Scene是最根层的Event
很显然,Scene这个Event包含了数量最多的子项。
通过搜索,找到了它定义在FDeferredShadingSceneRenderer::Render
中
为了测试,我将其外层调用暂时注释掉:
再开启引擎,就看到场景没有绘制了(不过周边UI还在,说明UI不在Scene里)
截帧也看不到Scene这个事件了
总结
RenderDoc截帧UE时“Event”来源于两方面:
- 图形API的调用(D3D12完整图形API可查阅这里)
- 而Event的自定义名字与层级结构,则是用
RDG_EVENT_SCOPE
宏实现的。
Scene 这个Event是最根层的,它定义在FDeferredShadingSceneRenderer::Render
中,可以以此为起点学习UE的渲染流程。
附加
这里可以在编辑器内改为前向渲染,不过前向渲染时仍旧走的是FDeferredShadingSceneRenderer::Render
,这个命名会有些误解。
看起来Renderer类只有两个,只是区分了桌面平台和移动平台。