背景
岗前培训需要对部分3A游戏截帧,从而进行画面分析,实际操作下来发现比较新的3A的DRM都做的比较严密,很难成功进行截帧。
本文对尝试过的截帧方案进行记录,以供之后参考。
常见截帧工具
RenderDoc
RenderDoc发布时已经是2014年,当时D3D9已经被逐步淘汰,因此RenderDoc完全不支持D3D9,并且未来也没有支持计划。不过可以尝试使用DXVK(使用Vulkan重新实现了D3D9等旧图形接口)将D3D9转为Vulkan进行调试。
使用RenderDoc调试Steam启动的游戏时,会常用到Global Hook功能,需要注意,该功能要求关闭Secure Boot功能,并且RenderDoc需要被安装在系统盘,因为非系统盘不会给安装目录生成short name,并且经过测试发现,即使使用指令生成short name也无法正常使用Global Hook功能。因此最好将RenderDoc安装在系统盘。
部分特殊情况下可以通过dll wrapper的方式对进程进行注入,从而绕过部分的防御机制,详细参见此文章与另一篇文章。基本原理为实现一个对应图形api dll的wrapper,在加载api dll的同时,加载RenderDoc的调试dll。
PIX
目前最新版本不支持D3D9与32位程序的调试。Steam的游戏子进程能被自动识别。
旧版本的PIX支持D3D9,可以通过 DirectX Software Development Kit 捆绑安装(此博客详尽的展示了旧版PIX的使用方法)。安装时可能遇到 S1023 的报错码,此时可以通过卸载系统中所有的VC++ 2010进行修复,详见此回答。
不同于目前新的截帧工具,旧版的PIX不能对子进程进行监听,因此需要通过steam启动的游戏无法正常被监听。查阅资料后发现,根据此回答,可以通过在游戏可执行问价的目录下创建steam_appid.txt
,并在其中写入该游戏的appid(可以通过系统主菜单的快捷方式属性中的URL获取),通过这种方式,大部分游戏都可以绕过steam进行启动。
Nsight Graphics
Nvidia提供的截帧工具,截止到现在的最新版已经不支持32位程序,需要回滚到2021.4左右的版本。需要注意,安装新版本的Nsight之后,需要重启进程,否则依然会报不支持32位进程的错,存在一定的迷惑性。
并且,官网提供的Nsight的最旧版本是2020版本,该版本已经不支持D3D9的调试,需要额外注意。更早版本官网并未提供下载,目前也没有找到其他第三方的下载存档。
GPA
新版本同样不支持d3d9。旧版本官方没有提供归档,不过可以从一个论坛页面找到支持D3D9的版本,但是测试发现,该版本能够在部分d3d9游戏中正常截帧,但是分析时无法正常打开,会给出 An unexpected error occurred.
的报错,该问题在此讨论中被认为是GPA版本过新导致的问题,不过由于官方并不提供旧版安装包,因此无法进行测试。
Apitrace
Apitrace支持D3D9调试,不过目前还不支持D3D12调试。
Apitrace可以通过dll wrapper的方式进行调试,这种方式在D3D10与D3D11以外的情况下无需执行指令,只需正常运行可执行文件即可进行trace(详见Apitrace说明文档)。这种wrapper的方式可以解决游戏运行时需要通过Steam启动,导致 apitrace
指令无效的问题。
不过,Apitrace的主要问题在于,其无法进行逐draw call的绘制,只能记录draw call的调用情况与逐帧的绘制结果,难以进行分析。
Apitrace的官网的Links章节提供了一些类似工具的相关链接,如果上述工具依然无法满足需求,可以进一步调研。
游戏测试
怪物猎人:荒野
RenderDoc无法正确识别API。
Nsight能够正常监听,但是截帧时游戏崩溃,将游戏画面设置修改为全低,可以截帧,但是结果全黑。
使命召唤20:现代战争3
RenderDoc在注入时报错,Global Hook也无法注入。
Nsight同样无法正常监听进程。
使命召唤12:二战
与使命召唤20类似,无法正常截帧。
使命召唤8:现代战争3
D3D9游戏,上述工具无法进行截帧,COD系列的DRM做的都比较到位。使用DXVK,RenderDoc能正常注入,但是截帧时游戏崩溃。旧版PIX则无法通过steam_appid.txt
的方式绕过steam启动,注入失败。
生化危机RE引擎系列
2代重置、3代重置、村庄可以正常使用RenderDoc截帧,4代重置无法截帧,API被识别为None。
这里比较怀疑是D加密导致的问题,因为截止至2025.4.30,上述生化危机作品中只有4代依然存在D加密(因此这里怀疑怪物猎人荒野也是同样的问题)。
生化危机6
D3D9游戏,旧版PIX也无法截帧,会提示该游戏禁止截帧分析(This program has indicated that it cannot be used with Direct3D profiling/analysis tools),DX应该提供了相关的接口给开发者。

生化危机4HD
D3D9游戏,可以使用旧版的PIX正常截帧。