UE | Android游戏内集成Renderdoc | Blurred code

UE | Android游戏内集成Renderdoc

2026/07/29

LastMod:2026/07/29

Categories: UE Mobile

Engine Version: 5.3.2

动机

在真机上调试抓帧总的来说有两个痛点。

  1. RenderDoc 抓帧时经常因为各种原因断掉。比如公司的测试机 Type-C 口经过不知道多少人反复插拔早就松松垮垮的了,WiFi 调试也不稳定,AP一漫游就断了,adb 在弱网环境下容易丢包断连。

  2. 条件抓取和部分抓取不好实现。内部抓取很容易做到满足某个条件时抓一帧,或者只抓某一帧的某个部分(如 Basepass),但外部抓取就很难做到。

做法

网上搜了一下,看见钱康来的博客已经记录过他们的探索了,至少这条路是行得通的。

高版本安卓注入 RenderDoc | Loading & Learning

我对 GLES 不感兴趣,所以反而要好做得多——毕竟 GLES 抓取需要 Hook 所有 GL API,而 Vulkan 有清晰的 LoaderLayer 概念。只需要做到两个操作:

  1. 在游戏内启动的时候把 libVkLayer_GLES_RenderDoc.so 加载进来。它没有使用 Android 的任何私有库,可以直接 dlopen,不需要像搞开源驱动 libVulkan_freedreno 那样搞一堆 hack hook。
  2. VulkanvkCreateInstance 处把 Layer 加进去。

libVkLayer_GLES_RenderDoc.so 在哪里

UE_Android_游戏内集成Renderdoc-2026-07-29-23-15-28

RenderDoc 的 APK 里就带有预编译好的库。

如何把它带到包里,可以参考 Engine\Source\Programs\UnrealBuildTool\Platform\Android\UEDeployAndroid.cs 中的 CopyVulkanValidationLayers 方法,沿着相关逻辑把 RenderDoc 的 layer 一并带进去即可。

如何加载 RenderDoc Layer

参考 Engine\Source\Runtime\VulkanRHI\Private\VulkanLayers.cpp,在 -vulkandebug 命令行参数下是如何加载 VK_LAYER_KHRONOS_validation 的,仿照该代码模式把 RenderDoc 的 Layer 加进去即可。RenderDoc 的 Layer 名为 VK_LAYER_RENDERDOC_Capture

理论上如果在 VulkanRHI 运行前就已经执行好了 dlopen,这里的 loader 可以遍历到 RenderDoc 的 Layer。

如何执行游戏内抓取

可以自己根据 renderdoc_app.h(RenderDoc 预编译包里自带)封装 RenderDoc 的初始化和抓取,也可以利用虚幻自带的 RenderDoc 插件(位于 Engine\Plugins\Developer\RenderDocPlugin)。如果用虚幻的插件,需要进行一定的改造,因为它默认只支持桌面平台,要移植到 Android 端需要屏蔽一些代码并做适配。

如果集成改造了RenderDoc插件,默认保存到Saved目录,这样就内置抓取以后就可以拖下来回放了。并且也可以让AI Agent去自动抓取,配合上RenderDoc-mcp去自动debug..(做梦中