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)

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来实现;OGL中会调用glPushGroupMarketEXT / glPopGroupMarketEXT两个API来实现。

编辑器截帧

编辑器中主要是通过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客户端的截帧方法同样适合编辑器

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

UE4中使用RenderDoc截帧的更多相关文章

  1. 3D游戏开发之在UE4中创建非玩家角色(NPC)

    接着上节我们继续学习,现在我们来创建一些NPC(non-playable characters,非玩家角色).在这个游戏中,当我们靠近NPC时,它们会做出相应的反应. 一 创建C++类 1) 在UE编 ...

  2. UE4中Bebavior Tree中Delay及其后面代码失效的原因

    具体原因是因为节点的执行过程中,该节点及其父节点的Decorator条件不满足,而节点又受到flow control的影响,导致中途强制结束了Task节点的执行,具体如下. UE4中的Behavior ...

  3. UE4 中的 C++ 编程介绍

    https://docs.unrealengine.com/latest/CHN/Programming/Introduction/index.html UE4 中的 C++ 编程介绍 Unreal ...

  4. tcpdump截帧工具使用

    一.tcpdump介绍 ​ tcpdump是Linux下功能强大的截帧工具,相当于windows下的wireshark一下,只是操作方式是命令行的,需要熟悉Linux命令行操作. ​ 常用的Linux ...

  5. 如何将MagicaVoxel模型导入UE4中(2)

    前言 当可以把MagicaVoxel的静态模型导入到UE4后,我又开始不满足了.默认第三人称蓝图的"汽车碰撞人偶(雾)"与场景中的体素画风格格不入,于是,我便想着用自己建造的体素画 ...

  6. ZeroMQ接口函数之 :zmq_msg_recv - 从一个socket中接受一个消息帧

    ZeroMQ 官方地址 :http://api.zeromq.org/4-2:zmq_msg_recv zmq_msg_recv(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_ ...

  7. UE4 中Struct Emum 类型的定义方式 笔记

    UE4 基础,但是不经常用总是忘记,做个笔记加深记忆: 图方便就随便贴一个项目中的STRUCT和 Enum 的.h 文件 Note:虽然USTRUCT可以定义函数,但是不能加UFUNCTION 标签喔 ...

  8. UE4 中在 Actor 中动态 Create Component 与ChildActor 的 小笔记

    Note:旧版本的UE4 的Attach 和12.13版本有些不一样 创建Component: UCpp_MyComponent* temp_imageCom = NewObject<UCpp_ ...

  9. UE4中使用数据表(Data Table)

    本文依据官方文档数据驱动游戏性元素整理而来. 做过游戏的应该都清楚,如果游戏稍微有点规模,那么使用数据驱动来做游戏一般是必不可少的一步,一般也就是策划通过本表的方式来解决.下面我们来简单说一下UE4中 ...

随机推荐

  1. Mysql 免安装教程 百度云网盘有文件和word说明

    一 把文件解压到一个目录下 这是解压后的目录 将my.ini文件考进去 双击打开my.ini 找到这两行更改成自己的解压路径保存 右键此电脑属性 找到高级系统设置配置环境变量 新建—>变量值是解 ...

  2. golang数据结构之用循环链表解决约瑟夫环问题

    josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid( ...

  3. 将scrapy爬取数据通过django入到SQLite数据库

    1. 在django项目根目录位置创建scrapy项目,django_12是django项目,ABCkg是scrapy爬虫项目,app1是django的子应用 2.在Scrapy的settings.p ...

  4. js 记录几个因惯性思维引发的代码BUG,开发思维方式的自我反省

     壹 ❀ 引 在写这篇文章之前,对于取什么标题其实让我纠结了好几天,这篇文章中我想说的东西与引用类型数据有关,也与我们的惯性思维有关.本文中展示的几段代码都非常简单,原型都来自于我的日常开发,但让你立 ...

  5. 前端笔记之React(七)redux-saga&Dva&路由

    一.redux-saga解决异步 redux-thunk 和 redux-saga 使用redux它们是必选的,二选一,它们两个都可以很好的实现一些复杂情况下redux,本质都是为了解决异步actio ...

  6. 持续集成(CI):API自动化+Jenkins定时构建

    一.系统管理 1.管理监控配置 系统管理>>系统设置>>管理监控配置 2.设置接收测试报告的邮箱 系统管理>>系统设置>>配置Extended E-ma ...

  7. SynchronusQueue

    /** * 当向SynchronousQueue插入元素时,必须同时有个线程往外取 * SynchronousQueue是没有容量的,这是与其他的阻塞队列不同的地方 */ public class S ...

  8. SpringBoot捕获AccessDeniedException

    https://www.jianshu.com/p/bb14cca5ab3d 自定义AccessDeniedHandler /** * @Author: jialing xu * @Descripti ...

  9. go-百度贴吧-纵向爬取

    百度贴吧纵向爬取 上一个是横向爬取的,这个纵向爬取,具体怎么做的看代码 package main import ( "fmt" "io" "net/h ...

  10. C# Stocket

    介绍 1.TCP/IP(Transmission Control Protocol/Internet Protocol) 即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计 ...