可可西

UE4中使用RenderDoc截帧

RenderDocsrcdocue4 docue4文档)是一个独立的开源图形调试器,通过采集和检查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(wikisrc)是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)  注:获取UI的Draw,需要开启该开关

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_EVENTSCOPED_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来实现。

 

编辑器或Standalone截帧

编辑器中主要是通过RenderDocPlugin插件调用void  FRenderDocPluginModule::CaptureFrame()函数来截帧,然后拉起RenderDoc进程

方法一:在编辑器非Play状态下,点击右上角按钮进行截帧;Play状态下,先Eject后,再点击右上角按钮进行截帧

方法二:通过renderdoc.CaptureFrame命令来截帧(支持编辑器和单机)

               renderdoc.CaptureFrameCount  10  // 连续截10帧,并保存到一个rdc文件中

               renderdoc.CapturePIE 12 // 在编辑器中,将当前地图Play,然后连续截取12帧

               renderdoc.CaptureDelayInSeconds 0   // 设置Delay的单位为帧

               renderdoc.CaptureDelayInSeconds 1   // 设置Delay的单位为秒

               renderdoc.CaptureDelay 15  // 当Delay的单位为帧时,表示设置延迟15帧;当Delay的单位为秒时,表示设置延迟15秒

                                                            //  注:这个只是设置,仍然需要调用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需可调试才能进行截帧

    方法a:App中AndroidManifest.xml的application标签里必须包含android:debuggable="true"属性

    方法b:使用root机,然后用mprop工具将系统的ro.debuggable设为1    判断方法:在手机上执行cat /default.prop,若其中的ro.debuggable=1,则可直接对所有的App截帧。

               (1)下载mprop工具后,将其发送到手机的上adb push mprop /data/local/tmp

               (2)以管理员进入adb shell,为mprop加可执行权限 chmod +x /data/local/tmp/mprop

               (3)执行/data/local/tmp/mprop ro.debuggable 1,将ro.debuggable设为1   注:可执行getprop ro.debuggable来查看是否修改成功

               (4)在adb shell中重启adb:stop;start

                 更多请参考:https://blog.csdn.net/linjf520/article/details/123355372

 

① 启动RenderDoc的Server端并建立连接

点击目标手机 1: Xiaomi Mi 10 (Offline),会启动RenderDoc的Server端,并与PC上的RenderDoc客户端建立了连接

 

uam中Executable Path设为:com.tencent.mf.uam/com.tencent.gcloud.msdk.core.policy.MSDKPolicyActivity    Command-line Arguments:-e extraArg '-NoLoadingScreen'

 

RenderDoc的Server端界面如下:

注1:如果首次在Android手机上使用RenderDoc,会根据当前手机cpu架构,来自动安装org.renderdoc.renderdoccmd.arm64.apkorg.renderdoc.renderdoccmd.arm32.apk

注2:如果当前手机在开发者选项未开启“USB安装”,可将apk拷贝到手机上手动安装

注3:可以用adb.exe shell am start -n org.renderdoc.renderdoccmd.arm64/.Loader -e renderdoccmd remoteserver来启动该Server端进程

安装后的所在的android目录

app目录:/data/app/org.renderdoc.renderdoccmd.arm64

data目录:/sdcard/Android/data/org.renderdoc.renderdoccmd.arm64

log文件:/sdcard/Android/data/org.renderdoc.renderdoccmd.arm64/files/RenderDoc/RenderDoc_2020.08.03_11.57.01.log  注:高版本的android系统会写在/sdcard/Android/media/org.renderdoc.renderdoccmd.arm64/files/RenderDoc/RenderDoc_2020.08.03_11.57.01.log

renderdoc.conf文件:/sdcard/Android/data/org.renderdoc.renderdoccmd.arm64/files/renderdoc.conf   注:高版本的android系统会写在/sdcard/Android/media/org.renderdoc.renderdoccmd.arm64/files/renderdoc.conf

 

注:点击菜单“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/data/com.tencent.mf.fps1/files/RenderDoc目录中,在关闭RenderDoc之前需要将它们保存到PC的目录中

         由于读写权限问题,Android11及以上系统会保存在/sdcard/Android/media/com.tencent.mf.fps1/files/RenderDoc目录中

注2:RenderDoc的RenderDoc_YYYY.MM.DD_hh.mm.ss.log在%Temp%\RenderDoc目录中   /sdcard/Android/media/org.renderdoc.renderdoccmd.arm64/files/RenderDoc/RenderDoc_YYYY.MM.DD_hh.mm.ss.log

注3:RenderDoc_app_YYYY.MM.DD_hh.mm.ss.log在/sdcard/Android/data/com.tencent.mf.fps1/files/RenderDoc目录中   /sdcard/Android/media/com.tencent.mf.fps1/files/RenderDoc/RenderDoc_app_YYYY.MM.DD_hh.mm.ss.log

注4:renderdoc.conf文件:/sdcard/Android/data/com.tencent.mf.fps1/files/renderdoc.conf     /sdcard/Android/media/com.tencent.mf.fps1/files/renderdoc.conf

 

最后,无论编辑器、PC客户端还是Android机,与RenderDoc建立会话后,后续也可以通过点击会话面板上的Capture Frame(s) Immediately按钮来快捷截帧

 

posted on 2019-10-31 16:17  可可西  阅读(19041)  评论(0编辑  收藏  举报

导航