美文网首页
【DirectX12笔记】内置RenderDoc抓帧和启动

【DirectX12笔记】内置RenderDoc抓帧和启动

作者: crossous | 来源:发表于2020-10-20 01:23 被阅读0次

  一般我们用RenderDoc调试DirectX12时,是在Launch Application中填入启动的EXE和工作目录,然后Launch:


  不过有时也想像Unity一样,通过App内置代码来启动RenderDoc,所以我参考了文档In Application API ,改造现有的程序。
  首先上RenderDoc安装目录,找到renderdoc.dll,和renderdoc_app.h,注意,如果程序是32位的,要到RenderDoc的X86子目录中找dll。
  暂时不考虑其他平台,Windows下,动态加载dll用下面的方法:
//别忘了#include "renderdoc_app.h"

    RENDERDOC_API_1_1_2 *rdoc_api = nullptr;//API接口

    if (HMODULE mod = LoadLibraryA("renderdoc.dll"))
    {
        pRENDERDOC_GetAPI RENDERDOC_GetAPI = (pRENDERDOC_GetAPI)GetProcAddress(mod, "RENDERDOC_GetAPI");
        int ret = RENDERDOC_GetAPI(eRENDERDOC_API_Version_1_1_2, (void**)&rdoc_api);
        assert(ret == 1);
    }
    else
    {
        std::cout << "RenderDoc Lode Error: " << GetLastError() << std::endl;
    }

  Renderdoc安装时会在注册表计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{5D6BF029-A6BA-417A-8523-120492B1DCE3}\InprocServer32中,记录dll路径,Unity和UE都是通过这种方法找到renderdoc.dll的。
  这个代码具体放置位置有要求,要在所有图形API调用之前,所以根据DX12龙书,我找到d3dApp.cpp定义的Initialize方法中,正好开头就是下面这种代码:

if(!InitMainWindow())
    return false;
//Init renderdoc api
//...

if(!InitDirect3D())
    return false;

  初始化后定义暂存截帧文件的位置模版,我是这么定义的:

rdoc_api->SetCaptureFilePathTemplate("RenderDocCapture/Capture");

  这样会在工作路径/RenderDocCapture下,不断存取Capture_frame1.rdc这样的文件,后面的数字是App运行到当前时间的帧数。
  如果不自定义,会存在C盘的某个Temp目录中,这个目录可以通过const char *GetCaptureFilePathTemplate()得到。
  然后用下面的方法截帧:

    if (GetKeyDown(Key::C))
    {
        rdoc_api->TriggerCapture();
        if(!rdoc_api->IsTargetControlConnected())
            rdoc_api->LaunchReplayUI(1, nullptr);
    }

  GetKeyDown是我自己定义的按键模块,这个根据自己的项目修改,TriggerCapture触发下一帧截取,IsTargetControlConnected判断是否打开了UI,如果没打开,则调用LaunchReplayUI打开RenderDoc,参数1是指立刻打开UI,参数2的nullptr是命令行参数。
  抓到的帧会存在刚刚定义的文件中,当RenderDoc退出时会询问是否保存抓到的帧,如果否,则文件会被删除。
  功能大致这样,也可以根据需要简单封装。

相关文章

  • 【DirectX12笔记】内置RenderDoc抓帧和启动

      一般我们用RenderDoc调试DirectX12时,是在Launch Application中填入启动的EX...

  • 【渲染逆向】Hook D3D API

    前言   RenderDoc等一系列抓帧工具的原理,是在运行前,在图形API初始化之前将自己的dll注入到目标程序...

  • 运行时数据区

    Q: 运行时数据区的生命周期 跟随JVM的启动和退出跟随线程的启动和退出 1. 栈帧 Q: 栈帧什么时候创建, 什...

  • AE抽帧的几种方法

    1.时间插件抽帧。 内置插件:Posterize Time , 修改帧率参数(意思是每秒多少帧),可以实现修改低于...

  • linux 内置命令 / 外置命令

    内置命令 / 外置命令 内置命令:系统启动就加载如内存, 效率高, 占资源不会开启子进程执行内置命令和 shell...

  • C的一次core的调试记录

    前言 程序同时需要支持DPDK和普通的抓包,dpdk抓包后台启动没问题,而普通抓包就会先core下,在执行后台启动...

  • Spring Boot知识整理(一)

    一、启动方式与部署   Spring Boot启动按照容器来分的话大概分为两种:内置tomcat启动和外部tomc...

  • Renderdoc调试总结

    http://aicdg.com/renderdoc-hlsl/很详细!!!

  • renderdoc源码

    rendererdoc是开源的代码,今天调试一个32位的程序,发现始终无法capture frames 尝试了好几...

  • 性能优化测试工具

    技术测试:renderdoc+unity(profiler+memory +frame)+instrument> ...

网友评论

      本文标题:【DirectX12笔记】内置RenderDoc抓帧和启动

      本文链接:https://www.haomeiwen.com/subject/fcdrmktx.html