资讯详情

d2r-mobile 图形层深潜:NVN 到 Metal 的 523 个函数接管与 Record/Replay 双分层架构

📅 2026/10/17 19:52:35 | 华诺云谱 👁 阅读
d2r-mobile 图形层深潜:NVN 到 Metal 的 523 个函数接管与 Record/Replay 双分层架构
移动开发图形学逆向工程游戏开发【免费下载链接】d2r-mobileOpen-source iOS / macOS compatibility layer for Diablo II: Resurrected with the Reign of the Warlock expansion. Runs your own Switch copy natively on iPhone, iPad and Mac — full touch controls, 60 fps, new endgame modes. Bring your own game files. 开源的《暗黑破坏神 II狱火重生》术士君临 iOS / macOS 兼容层项目地址https://gitcode.com/gh_mirrors/d2/d2r-mobile点击查看免费下载d2r-mobile 是开源的《暗黑破坏神 II狱火重生》iOS / macOS 兼容层它的图形层把 Switch 专有的 NVN 图形接口完整重写在 Apple Metal 之上游戏发出的523 个 NVN 函数调用全部被接管先录成命令流提交时再逐条回放为 Metal 命令——这套 Record/Replay 双分层架构就是原版程序在 iPhone 上稳定 60 fps 的底座。本文用通俗的方式讲清这 523 个函数是怎么被接管的以及双分层架构如何工作并带你快速定位到对应源码。为什么 NVN 必须被整个换掉Switch 版游戏的画画面全部通过NVNSwitch 原生图形接口服务于 Tegra X1 GPU完成。而 iPhone / Mac 上只有Metal。d2r-mobile 的选择不是模拟一个 NVN而是原地替换驱动原版 NVN 驱动一条指令都不执行游戏对 NVN 的每一次调用都落到宿主用 C 写的实现里再翻译成 Metal。游戏对此完全无感——它以为自己还在 Switch 上运行。523 个函数接管一个入口与一套跳板接管的关键在于游戏主程序只导入一个 NVN 符号nvnBootstrapLoader其余所有 NVN 函数都是通过这个入口按名字取地址的。宿主在 hle_nvn.c 中强制接管了这个符号于是所有取址请求都进了自己的槽表。具体机制拆解环节说明名字表游戏共会取址523 个NVN 函数名全部登记在 names.txt跳板thunk每个名字对应一个跳板生成文件 nvn_thunks.S先把该函数的调用计数加一再跳到真正的实现216 个有实现游戏主程序里真正有调用点的是 216 个见 nvn_slots.tsv203 个按 NVN 语义真实实现13 个是空实现g_nops307 个报红桩其余 307 个接报红桩函数一旦被调到日志打印【红】NVN 未实现被调用名字——宁可报错也不静默出错编译期签名检查每个实现都对照 nvn_protos.h 做签名检查由于 Apple arm64 与 Switch 的调用约定在小整型参数上不同NVNboolean参数一律按uint32_t接收、只看低 8 位一个容易忽略的细节当游戏查询设备属性时图形层返回的是Tegra X1 的实测值hle_nvn.c中的g_devinfo表让游戏拿到的硬件参数与原版主机一致。Record/Replay 双分层架构先录后放这是图形层最核心的设计分为两层、两个文件第一层接口层写hle_nvn.c 负责记账对象就地存放宿主侧对象直接存在游戏为 NVN 对象分配的内存里布局定义在 nvn_obj.h每个布局都有静态断言保证不超过 NVN 的保留大小——游戏怎么按值拷贝都不会错位命令录制绑定、绘制、清除这类只改 GPU 状态的调用按nvn_obj.h的记录格式写进游戏提供的命令内存。此时不碰任何 Metal 对象。第二层回放层读nvn_mtl.m约 6400 行负责执行提交命令流时才把记录回放成 Metal 命令。要点包括GPU 地址 CPU 地址内存池建成零拷贝MTLBuffer所以只支持统一内存设备缓存渲染管线与深度模板状态按状态哈希缓存启动时再按 pso_manifest.tsv 预热清单在后台预建着色器与管线进游戏不卡顿时序正确同步对象就绪、事件写值、计数器等GPU 完成效果只在 Metal 命令缓冲真正完成之后才发生出图节拍交换链贴图画到CAMetalLayer节拍由 nvn_pace.h 的节拍器调度锁 60 fps。⚡主要的 NVN → Metal 对象映射完整对照见 nvn_metal_mapping.zh-CN.mdNVN 对象Metal 落地DeviceMTLDevice需统一内存MemoryPool游戏内存上的零拷贝MTLBufferTextureMTLTexture上传前解排布见下文Program离线翻译好的键_b.metallib着色器库CommandBuffer录制在命令内存里的记录流QueueMetal 命令队列SubmitCommands 回放并提交这种分层的最大好处录什么与怎么放彻底解耦所有性能优化管线缓存、pass 合并、脏页追踪都集中在回放层做且可用单元测试逐个验证见 tests/ 目录的 20 多个用例。着色器翻译链手机上不做任何运行时翻译游戏的着色器是 Tegra X1Maxwell 指令集的GPU 机器码无法被 Metal 直接使用。d2r-mobile 的做法是把翻译全部放在电脑上离线完成链路三步机器码 → SPIR-V由 C# 工具 dmsh_xlate 借助 Ryujinx 的着色器翻译库完成SPIR-V → MSLspirv-cross 转成 Metal 着色语言源码MSL → 着色器库xcrun metal/metallib编译成二进制库。整条链由 dmsh_build.py 驱动setup.sh会自动跑。两个精巧的设计值得新手记住哈希键定位每个着色器以其控制段0x880 字节sha256 的前 16 位十六进制为键。运行时游戏把控制段交给nvnProgramSetShaders回放层算出同一个键直接取库——全程零翻译开销翻译链版本 V链上任何源文件、翻译选项或工具指纹一变版本 V12 位十六进制就变着色器库必须重出、宿主必须重编版本对不上直接报红拒载。这杜绝了库和代码不同步这类灵异问题。如果构建机没有 Apple Metal 编译器Windows、Linux、没装 Xcode 的 Macnometal_run.py 会让链条照常跑完前两步把 MSL 源码原样打进包里改由手机首次启动时编译一次系统会自动缓存。此外主程序里内嵌的 4 个计算着色器不在着色器包中是按反汇编手写的 MSL见 nvn_builtin.h。贴图处理块线性排布与老芯片兼容 游戏打包的贴图按 Tegra X1 的**块线性block-linear**布局存储——数据不是一行接一行而是按 64 字节 × 8 行的小块GOB交错排布。上传 Metal 前必须先解排布deswizzle成普通行式布局实现在 nvn_deswizzle.c另有 GPU 计算着色器版本加速上传。另外游戏重写贴图内容后是否需要重新上传由 nvn_dirty.c 用写保护脏页追踪判定避免无效重传。老芯片A16 及更早不支持 BC 压缩纹理则走 nvn_bcdec.c 的 CPU 解压路径模块说明见 tex/README.zh-CN.md。新手阅读路线从哪几个文件入手按这个顺序读图形层会越读越顺文件一句话定位dm/gfx/README.zh-CN.md图形层总览建议先读dm/gfx/nvn/hle_nvn.c接口层523 个函数接管、对象实现、命令录制dm/gfx/nvn/nvn_mtl.m回放层Metal 设备、管线、绘制、出图dm/gfx/nvn/nvn_obj.h两层共用的对象布局与命令记录格式dm/gfx/nvn_metal_mapping.zh-CN.md每个 NVN 对象/命令落到 Metal 的哪dm/gfx/tex/README.zh-CN.md贴图格式映射、解排布、BC 解压dm/tools/d2rm_pack.pyiOS 打包入口把着色器库拷进 App动手验证也很简单在仓库根目录运行图形层单元测试make -C dm/gfx/tests run其中 t_nvn.c 会像游戏一样从nvnBootstrapLoader取址一路走到出图是最能直观理解整条链路的一个测试。小结完整替换而非打补丁d2r-mobile 图形层的设计可以浓缩成三句话接管——523 个 NVN 函数经跳板全部落到宿主实现原版驱动零指令执行分层——接口层只管记录回放层只管执行录制与回放解耦离线——着色器在电脑上翻译编译好手机运行时零翻译、零卡顿。遇到未实现的路径它选择报红而不是假装成功——这正是这套架构能稳定支撑 44 台测试机通关全部难度的底气所在。如果你想继续深挖docs/DERIVED.zh-CN.md 记录了仓库携带的接口信息清单是理解我们掌握了什么的最好入口。赞分享移动开发图形学逆向工程游戏开发【免费下载链接】d2r-mobileOpen-source iOS / macOS compatibility layer for Diablo II: Resurrected with the Reign of the Warlock expansion. Runs your own Switch copy natively on iPhone, iPad and Mac — full touch controls, 60 fps, new endgame modes. Bring your own game files. 开源的《暗黑破坏神 II狱火重生》术士君临 iOS / macOS 兼容层项目地址https://gitcode.com/gh_mirrors/d2/d2r-mobile点击查看免费下载相关推荐d2r-mobile 图形层深度解析NVN → Metal 录制回放架构与离线着色器翻译链d2r mobile 图形层深度解析NVN → Metal 录制回放架构与离线着色器翻译链 d2r mobile 以兼容层方式在 iOS / macOS 上原移动开发图形学逆向工程游戏开发D2R Mobile 图形层全解析NVN → Metal 对象与命令映射指南D2R Mobile 图形层全解析NVN → Metal 对象与命令映射指南 导读 本指南以 D2R Mobile 图形层 dm/gfx 的 NVN →移动开发图形学逆向工程游戏开发OpenTelemetry 与 Jaeger 数据模型转换全解Grafana Tempo 中 jaeger translator 的字段映射规则与实现原理OpenTelemetry 与 Jaeger 数据模型转换全解Grafana Tempo 中 jaeger translator 的字段映射规则与实现原理 本移动开发图形学逆向工程游戏开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑