
【免费下载链接】pinyon-shiftA playable preview of Forza Horizon static recompilation项目地址https://gitcode.com/gh_mirrors/pi/pinyon-shift点击查看免费下载Pinyon Shift 把 Xbox 360 版《Forza Horizon》重新编译为 PC 原生程序其核心是一套专为这款游戏打造的原生渲染器它不再模拟 Xenos GPU而是直接解读游戏发出的 PM4 命令流在 Vulkan 上执行 EDRAM 表面管理、Resolve 与纹理解码让游戏在 1x 到 4x 分辨率下以显示器刷新率运行。这篇文章带你完整看懂这条渲染链路。为什么不用通用模拟而要游戏专用渲染器项目最初基于 ReXGlueXenia 衍生的 Xenos 模拟渲染器帧率只有约 28 fps。团队换了思路先对游戏实际发给 GPU 的内容做一次完整普查census——在 17,580 帧脚本化路线上逐帧统计而不是猜测。结果是游戏只用极其有限的 GPU 特性集——游戏使用的特性数量渲染目标配置Render target configurations29 种后续路线 11Resolve 种类20 种10纹理格式与维度组合22 种每个 draw 的颜色目标固定 1 个无 MRT图元类型三角带、列表、四边形、点、矩形内存导出memexportdraw0前缓冲恒为 1280×720、10:10:10:2有限且可枚举的帧契约意味着可以写一个只处理这套配置、其余一律记录原因并拒绝的渲染器。这套契约记录在 NATIVE_FRAME_CONTRACT.md某模式只有在整条路线上跳过计数为零时才算被覆盖。PM4 命令流解码、录制、提交三条流水线游戏的 GPU 命令以 PM4 数据包的形式写入命令环。几乎全部 draw 都以PM4_INDIRECT_BUFFER形式到达——游戏提前建好了命令缓冲每帧只是重放实测每帧约 5,000 个 draw 中只有 42 个来自即时发射器且 96% 的间接缓冲在相邻帧间字节级一致。渲染器把这拆成多个职责清晰的线程线程职责Guest render thread游戏自带的 D3D 运行时写 PM4 包GPU Commands把数据包解码进影子寄存器文件处理WAIT_REG_MEM加载微码时做哈希GPU Recorder持有真正的寄存器状态、缓存与执行器为每个 draw 推导管线并录制延迟命令流GPU Submission每 1,024 个 draw 向 Vulkan 提交一次vkQueueSubmit并负责上屏Pipeline / Shader / Storage 工作线程在热路径之外构建管线、翻译着色器、写缓存顺序是难点一个比赛帧约有 280 次事件写入、25–30 次 fence 写入、5 次中断和 1 次 swap。fence 写入是记录而非等待只有当录制线程消费完其之前的全部内容游戏才能看到 fence。解码与录制拆分后比赛场景从 17.67 ms 降到 16.46–16.75 ms 每帧。这条链路对应的宿主侧入口在 guest_output_renderer.cpp 和 graphics_hooks.cpp。EDRAM 表面与转移TransferXbox 360 的 Xenos GPU 先画进 10 MB 片上显存 EDRAM再显式拷出到主存。FH1 原生执行器把 EDRAM 抽象成一张 2,048 个 tile 的所有者地图表面Surface每个渲染目标是宿主图像键为 EDRAM 基 tile、pitch、MSAA 模式、深度/颜色与格式高度延伸到同位置下一个表面所有者地图记录每个 tile 最后被哪个表面写入以及其 stencil 是否可能非零转移Transfer当某个 draw 占用别的表面拥有的 tile 时旧内容必须搬走——颜色走像素 pass深度走经 word buffer 的 compute pass。没有VK_EXT_shader_stencil_export扩展的显卡如 NVIDIA上深度转移要 9 个 pass。一个巧妙的优化对ALWAYS深度测试或不裁剪的 draw执行器直接在CPU 上跑一遍顶点着色器来圈定覆盖范围避免一个 stencil draw 声称占用全部 2,048 个 tile这类过度保守的转移。转移的瓶颈是 barrier 而非像素量。Resolve结果如何回到游戏可见的纹理Xenos 的 resolve 是把 EDRAM 内容显式拷回主存的机制。在 FH1 原生执行器里resolve 执行一个 compute 着色器按游戏的分块纹理布局写入一份游戏内存的宿主镜像并标记该区间由 GPU 写过。随后与该区间重叠的纹理全部失效下次采样时按请求格式重新解码——一个机制同时覆盖了部分 resolve、多格式别名同一地址、CPU 复用内存等所有情况深度 resolve 必须精确复现打包的 depthstencil 位因为后续 draw 会以24_8/24_8_FLOAT读取它可接受的差异只有 D24S8 舍入的 1 个 LSB 与 float24 低尾数位。快速路径叠在其上resolve 直接写入当前仍然有效的纹理raw-bits 视图reload 时只重新分块 resolve 改动过的 32 行带。普查还发现唯一的 CPU 回读场景是车辆缩略图渲染→resolve→CPU 压缩因此对 256 KiB 以上的一次性 resolve 会在下一个 CPU 可观察命令前拷回游戏内存。20 种 resolve 的完整表格见 NATIVE_FRAME_CONTRACT.md。纹理解码从游戏内存到 Vulkan 采样纹理缓存复用 Xenia 衍生的核心跑在执行器的内存镜像之上键来自采样常量——基地址、格式、尺寸、pitch、tiling、mip 范围、端序与 swizzle解码compute 着色器做反分块 字节交换覆盖 DXT1/3/5、DXN、CTX1、DXT3A/5A、10:11:11 以及 16 位归一化与深度格式不支持 BC 的设备可强制走通用 BC 解码路径失效CPU 写用页写监视page write-watch发现GPU 写由 resolve 标记靠每次分配的写入代际write generation而非地址区分。这一细节曾让一条路线的顶点上传量从 41.6 GB 降到 0.42 GBGamma主机的 gamma 纹理用分段线性曲线转换默认在着色器内精确复现也可切换更省但中间调偏暗的 sRGB 快速路径。着色器与上屏链路的最后两环着色器游戏的 Xenos 微码由 ShiftGlue 翻译器转成 SPIR-V。为这款游戏修过三个关键问题HDR 采样的指数偏置读错字、全像素 quad 才执行的前向跳转、以及带导数 cube 采样改用隐式 LOD偏置。翻译结果与管线描述跨次保存设置阶段还会隐藏运行约两分钟的预热路线——空缓存时首帧超预算时间从 13.0 s 降到 5.7 s。着色器语料工具能从光盘的.fxobj文件提取 3,349 个唯一程序打包为可选的.pnsp格式相关工具见 shader_capture.cpp 与 SHADER_PACK_FORMAT.md。上屏swap resolve 把前缓冲写入镜像presenter 应用游戏 gamma 曲线与可选 FXAA再用双线性、CAS 或 FSR 1 缩放Windows 走 scRGB HDRAndroid 走 HDR10 并随面板方向预旋转交换链。分辨率1x–4x 为整倍缩放着色器翻译器把缩放烘焙进去guest 可见的一切保持游戏尺寸只有渲染缓冲随倍率放大。延伸阅读与关键文件主题位置帧契约29 表面 / 20 resolve / 22 纹理布局NATIVE_FRAME_CONTRACT.md官方站点渲染器章节renderer.md每项优化的实测数字gpu-optimizations.mdXenos 模拟路径的退役记录XENOS_RETIREMENT_BACKLOG.md早期研究笔记含失败路线RESEARCH.md宿主侧渲染器入口guest_output_renderer.hPinyon Shift 原生渲染器最有借鉴价值的经验是用普查得到的有限契约替代通用模拟——先花两周数清楚游戏到底用什么再写一个只处理这些、其余全部拒绝并记录的执行器。这套方法同样适用于任何静态重编译项目。赞分享【免费下载链接】pinyon-shiftA playable preview of Forza Horizon static recompilation项目地址https://gitcode.com/gh_mirrors/pi/pinyon-shift点击查看免费下载相关推荐ZeldaWWHDRecomp的Vulkan渲染器内幕从Guest命令到原生渲染管线的完整解析ZeldaWWHDRecomp的Vulkan渲染器内幕从Guest命令到原生渲染管线的完整解析 ZeldaWWHDRecomp 是一款将《塞尔达传说风之杖Dejavu指纹生成原理深度解析从频谱图到哈希指纹的完整流程Dejavu指纹生成原理深度解析从频谱图到哈希指纹的完整流程 Dejavu音频指纹识别系统是一个基于Python的强大音频识别工具它通过独特的指纹生成算法将音频处理终极指南Prerender核心原理深度解析从URL到HTML的完整渲染流程终极指南Prerender核心原理深度解析从URL到HTML的完整渲染流程 Prerender是一个基于Node.js的服务它使用Headless Chr后端开发工具上一篇AlgerMusicPlayer 快速上手本地服务音乐播放器完整指南下一篇docker-selenium Firefox 118 镜像标签体系解析从 tag_and_push_browser_images.sh 输出看版本固定与发布流程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考