UE4中使⽤RenderDoc截帧
(,,,)是⼀个独⽴的开源图形调试器,通过采集和检查GPU上运⾏的单个帧,来定位图形bug和优化性能
RenderDoc⽀持任何在Win7、Win10、Linux或Android上使⽤Vulkan、D3D11、D3D12、OpenGL3.2+ & OpenGL ES2.0-3.2的应⽤程序市⾯上⼤部分Android平台的GPU都是通⽤的,因此,RenderDoc作为通⽤的图形调试器,对这些GPU都可以进⾏截帧
⽽不像⾼通和mali的截帧⼯具那样,需要区分GPU(⾼通GPU只能snapdragon截帧⼯具,mali的只能⽤Mali Graphics Debugger)RenderDoc允许开发者编写python脚本来快速发现当前帧绘制中存在的问题、提⾼截帧分析效率和对使⽤的资源统计分析(Drawcall与纹理、shader program 信息的统计与分组等)
RenderDocPlugin(,)是UE4引擎中集成的⼀个插件(代码在:Plugins\Developer\RenderDocPlugin),⽅便UE4拉起和调⽤RenderDoc⼯具
环境设置
①安装RenderDoc⼯具(缺省会安装到C:\Program Files\RenderDoc)
②在UE4编辑器的Plugins⾯板中搜索RenderDocPlugin,并勾选Enabled启⽤该插件
③按照提⽰,重启UE4编辑器,此时C:\Program Files\RenderDoc\renderdoc.dll会被加载到编辑器进程
④设置RenderDoc:在UE4编辑器的Project Settings⾯板中Plugins -- RenderDoc标签中
这些设置项可在Output Log⾯板的Cmd(输出到log)和游戏控制台(输出到控制台窗⼝)中执⾏命令进⾏查看和修改FrameCaptureSettings下的选项勾选得越多,抓取的帧中数据就越丰富,⽂件也越⼤,也会使得截取和分析帧的时间更久
renderdoc.BinaryPath// 查看RenderDoc的安装路径
renderdoc.BinaryPath "C:\Program Files\RenderDoc" // 设置RenderDoc的安装路径为C:\Program Files\RenderDoc
renderdoc.CaptureAllActivity 1 // 勾选CaptureAllActivity(获取编辑器所有viewport和窗⼝的渲染数据,⽽不仅仅是当前viewport)renderdoc.CaptureCallstacks// 查看CaptureCallstacks(获取图形API的调⽤堆栈)是否勾选
renderdoc.EnableCrashHandler 0// 取消勾选EnableCrashHandler(截帧崩溃时是否使⽤RenderDoc的crash handler)
renderdoc.ReferenceAllResources// 查看ReferenceAllResources(获取所有mesh、材质,纹理等渲染资源,开启该选项会导致帧⽂件很⼤)是否勾选
renderdoc.SaveAllInitials 1// 勾选SaveAllInitials(获取所有mesh、材质,纹理等渲染资源的初始状态,开启该选项会导致帧⽂件很⼤)renderdoc.ShowHelpOnStartup// 查看ShowHelpOnStartup(启动编辑器时是否弹出RenderDoc的帮助对话框)是否勾选
⑤截帧后Shader只能看到汇编代码⽚段,若想看到源代码,需要打开Engine\Config\ConsoleVariables.ini配置⽂件,取消以下两⾏的注释r.Shaders.Optimize=0
r.Shaders.KeepDebugInfo=1
⑥ UE4为了⽅便对帧的绘制过程进⾏分析,代码中插⼊了很多Event调⽤,⽤来说明后⾯的渲染⾏为
可在控制台中执⾏ToggleDrawEvents命令来打开和关闭Event的调⽤
在UE4中插⼊Event主要是通过调⽤SCOPED_DRAW_EVENT、SCOPED_CONDITIONAL_DRAW_EVENT等宏来构造⼀个TDrawEvent<TRHICmdList>对象并调⽤Start⽅法,然后在对象析构时调⽤其Stop⽅法
相关的宏和代码在:RealtimeGPUProfiler.h RealtimeGPUProfiler.cpp
Start / Stop⽅法会调⽤不同渲染API的RHI的PushEvent / PopEvent⽅法,由这些PushEvent来实现Event标记的添加。
如:Dx中会调⽤D3DPERF_BeginEvent / D3DPERF_EndEvent两个API来实现;DXUT库中可使⽤DXUT_BeginPerfEvent
/ DXUT_EndPerfEvent宏(从D3DPERF_BeginEvent / D3DPERF_EndEvent上封装)
OGL中会调⽤glPushDebugGroup / glPopDebugGroup两个API来实现。
编辑器截帧
游戏xml文件修改编辑器中主要是通过RenderDocPlugin插件调⽤void FRenderDocPluginModule::CaptureFrame()函数来截帧,然后拉起RenderDoc进程
⽅法⼀:在编辑器⾮Play状态下,点击右上⾓按钮进⾏截帧;Play状态下,先Eject后,再点击右上⾓按钮进⾏截帧
⽅法⼆:通过renderdoc.CaptureFrame命令来截帧(⽀持编辑器和单机)
⽅法三:启动RenderDoc,点击菜单:File -- Attach to Running Instance
点击Connect to App按钮,让RenderDoc和⽬标进程建⽴会话,然后点击会话⾯板上的Capture Frame(s) Immediately按钮进⾏截帧
注1:截取的帧会临时保存在项⽬⼯程的Saved\RenderDocCaptures⽬录中,截取成功后,会使⽤RenderDoc打开该临时帧⽂件,若需要保留该⽂件需要⼿动进⾏保存
注2:RenderDoc的log⽂件在%Temp%\RenderDoc⽬录中
PC客户端截帧
⽅法⼀:从RenderDoc中拉起⽬标进程
①启动RenderDoc,点击菜单:File -- Launch Application,然后填写exe可执⾏路径(注:如果游戏进程是被登录器等作为⼦进程拉起,需要勾选"Capture Child Processes")
② Launch启动游戏后,然后按F12进⾏截帧
⽅法⼆:在启动初期(任何图形API都没有调⽤的情况下),将RenderDoc注⼊到⽬标游戏进程
①启动RenderDoc,点击菜单:File -- Inject into Process,搜索并选中⽬标进程,然后点击Inject按钮进⾏注⼊
为了抓启动初期这个时间点,可以使⽤windbg调试运⾏进程(启动后会⽴即中断到windbg中),然后在RenderDoc中准备好后,在windbg中F5运⾏后,在RenderDoc中⽴即进⾏Inject
另外,对于⾮shipping版的游戏进程,可以带上-WaitForDebugger启动,这样游戏会⼀直等待调试器Attach,然后在RenderDoc中Inject,最后拿windbg或vs Attach游戏并让其继续运⾏
② Launch启动游戏后,然后按F12进⾏截帧
⽅法三:使⽤global process hooking来建⽴与RenderDoc之间的会话
①在RenderDoc菜单Tools -- Settings⾯板的General标签下勾选"Allow global process hooking - be careful"
②点击菜单:File -- Launch Application,填写exe可执⾏路径,然后点击"Enable Global Hook"按钮,让hook钩⼦对⽬标路径进⾏监听,⼀旦有进程启动⾃动完成注⼊
③按照正常流程启动游戏后,然后按F12进⾏截帧
注1:截取的帧缺省会保存在%Temp%\RenderDoc⽬录中(可在RenderDoc菜单Tools -- Settings⾯板的General标签下的Directory for temporary capture files中指定路径)
注2:RenderDoc的log⽂件在%Temp%\RenderDoc⽬录中
注3:PC客户端的截帧⽅法同样适合编辑器
Android截帧
1. ⽬标⼿机在开发者选项中打开如下这些开关
2. APP需可调试才能进⾏截帧,即App中l的application标签⾥必须包含android:debuggable="true"属性
①启动RenderDoc的Server端并建⽴连接
点击⽬标⼿机1: Xiaomi Mi 10 (Offline),会启动RenderDoc的Server端,并与PC上的RenderDoc客户端建⽴了连接
RenderDoc的Server端界⾯如下:
注1:如果⾸次在Android⼿机上使⽤RenderDoc,会根据当前⼿机cpu架构,来⾃动安
装derdoccmd.arm64.apk或derdoccmd.arm32.apk
注2:如果当前⼿机在开发者选项未开启“USB安装”,可将apk拷贝到⼿机上⼿动安装
安装后的所在的android⽬录
app⽬录:/data/derdoccmd.arm64
data⽬录:/sdcard/Android/derdoccmd.arm64
log⽂件:/sdcard/Android/derdoccmd.arm64/files/RenderDoc/RenderDoc_2020.08.03_11.57.01.f⽂件:/sdcard/Android/derdoccmd.arm64/f
注:点击菜单“File” -- “Attach to Running Instance”弹出的Remote Host Manager⾯板中,可以看到RenderDoc的Server端已经在Xiaomi Mi 10⼿机上运⾏起来并与PC上的RenderDoc客户端建⽴了连接
②启⽤⼿机要截帧的App
注1:注⼊成功后,游戏界⾯的顶端会显⽰⼀些⽂字
注2:另外,可以在Remote Host Manager⾥⾯看到被RenderDoc的Server注⼊的进程列表
③点击“Capture Frame(s) Immediately”按钮来截帧
注1:截取的帧会保存在⼿机的/sdcard/Android/t.mf.fps1/files/RenderDoc⽬录中,在关闭RenderDoc之前需要将它们保存到PC的⽬录中
注2:RenderDoc的RenderDoc_YYYY.MM.ss.log在%Temp%\RenderDoc⽬录中
注3:RenderDoc_app_YYYY.MM.ss.log在/sdcard/Android/t.mf.fps1/files/RenderDoc⽬录中
注4:f⽂件:/sdcard/Android/t.mf.fps1/f
最后,⽆论编辑器、PC客户端还是Android机,与RenderDoc建⽴会话后,后续也可以通过点击会话⾯板上的Capture Frame(s) Immediately按钮来快捷截帧
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论