Braxton-Bevis/bmk4

GitHub: Braxton-Bevis/bmk4

将《使命召唤4》引擎(KisakCOD)从 Win32/D3D9/x86 平台移植到 arm64-apple-ios 的开源工程实验,通过 DXVK 和 Metal 实现原生渲染。

Stars: 1 | Forks: 0

# BMK4 **B**raxton · **M**etal · **K**isak · **4** — 将《使命召唤4》引入 Apple silicon 平台。 这是一项 Bevis Metalworks 项目,由 LWSS 基于 [KisakCOD](https://github.com/SwagSoftware/KisakCOD) 打造。 ### 将从零开始的《使命召唤4》引擎反编译项目移植到 `arm64-apple-ios` [![iOS Stub](https://static.pigsec.cn/wp-content/uploads/repos/cas/eb/ebad8a435a748796f2d22402f70426a2aea1a2ee9e14135795ac841c29d61740.svg)](https://github.com/Braxton-Bevis/bmk4/actions/workflows/ios-stub.yml) [![iOS Engine Compile Probe](https://static.pigsec.cn/wp-content/uploads/repos/cas/8a/8a73660e3798ae88b19f95adba1ed9c4bf9b0573eff2474e4be358aedd31275c.svg)](https://github.com/Braxton-Bevis/bmk4/actions/workflows/ios-compile-probe.yml) [![Windows Build](https://static.pigsec.cn/wp-content/uploads/repos/cas/32/327c5af3518a267743efcf0055a9bb1fe4aa158ebd9ba22a91fe3fa2b37c3e39.svg)](https://github.com/Braxton-Bevis/bmk4/actions/workflows/build-kisarcod-win.yaml) [![License: GPL-3.0](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE) Metal render loop live in the iOS Simulator   Graphics settings menu, MetalFX controls, and virtual game controller *以上两张屏幕截图均由 CI 从启动的 iOS 模拟器中自动捕获——本仓库中的每一项声明均经过机器验证。*
## 这是什么? 一场工程实验:**[KisakCOD](https://github.com/SwagSoftware/KisakCOD)(一个 GPL-3.0 协议、基于 Win32/x86-32/DirectX 9 的《使命召唤4》多人模式引擎重实现)能在多大程度上被推向在 iPhone 上原生运行?** 我们无法从任何 macOS/Linux/ARM 分支起步。该引擎全面依赖于 Windows API、32 位 x86 结构体布局以及 D3D9 渲染器。本仓库诚实地记录了这次平台升级的过程,通过每一个里程碑进行展示,并且每一次编译和启动都在 GitHub Actions 的 macOS runner(Xcode 16.4,iOS 18.5 SDK)上得到了验证——整个实验都是在一台 Windows 笔记本上驱动的,**完全没有使用本地编译器**。 ## 当前状态概览 | 目标 | 状态 | |---|---| | iOS 应用外壳:Metal 图层、经模拟器验证的启动、未签名的 arm64 `.ipa` 构件 | ✅ 完成 | | MetalFX 空间超分(50/75% → 原生),受运行时和 SDK 控制 | ✅ 位于 stub 中 | | 控制器支持:屏幕 `GCVirtualController` + 物理手柄 | ✅ 位于 stub 中 | | 应用内图形设置菜单(MetalFX、渲染缩放、帧率上限) | ✅ 位于 stub 中 | | 构建重定向:`cmake -DKISAK_PLATFORM=ios` + CI 中的逐文件编译普查 | ✅ 完成 | | Windows 到 iOS 的依赖映射(每个 API 系列 → 具体替代方案) | ✅ [DEPENDENCY_MAP.md](DEPENDENCY_MAP.md) | | 文件系统沙盒化(`fs_basepath` → 应用包,`fs_homepath` → `Documents/`) | ✅ 已落地 | | 正在为 `arm64-apple-ios` 编译的引擎翻译单元 | ✅ **23/23 普查翻译单元** — 包含游戏逻辑、脚本 VM、多线程、FS (POSIX)、网络 (BSD 套接字)、声音 (Miles stub) 以及渲染器初始化 | | iOS SDK 上的 DXVK 原生头文件吸收了 D3D9 头文件层 | ✅ 已验证 | | 作为 iOS 库构建的 DXVK d3d9(渲染器运行时) | ✅ **`libdxvk_d3d9.a` (arm64)** — 5 处补丁 + SDL2-iOS WSI,[构建脚本](scripts/platform/ios/build-dxvk-ios.sh);运行时启动对比 MoltenVK 是下一个前沿领域 | | 引擎在设备上链接/运行 | 🟡 **首批引擎代码已在 iOS 上执行** — 数学/位打包/字符串翻译单元已链接至 stub 中,并在模拟器**以及 iPad Pro (M5)** 上进行了验证,同时开启了 MetalFX 空间超分,运行在 120 fps | | win32 构建不受上述任何内容影响 | ✅ 完整的引擎构建成功(Debug + Release) | ## 实验过程 经过八轮 CI **编译普查** — 在每次修复浪潮后,针对真实的 iOS SDK 编译具有代表性的引擎文件,并逐字记录失败情况: | 轮次 | 修改内容 | 结果 | |---|---|---| | 1 | 原始引擎对比 iOS SDK | 0/13 编译通过 — 发现了六个不同的错误层级 | | 2 | ``,`random()` POSIX 冲突修复,`-fdeclspec`,FS 沙盒补丁 | 首个 iOS 平台文件通过 | | 3 | 通过可审计的宏放宽了所有 **249** 个 x86-32 布局断言 | 触及 SSE 墙(`xmmintrin.h`) | | 4 | 内置 [sse2neon](https://github.com/DLTcollab/sse2neon) | SSE 墙已破;**`d3d9.h` 通过 DXVK 头文件解析** | | 5 | Win32 网关头文件垫片 | 8 个翻译单元汇合于单一的 `d3d9.h` 墙 | | 6 | DXVK 原生头文件成为基准 | 渲染器头文件被完全吸收 | | 7 | ODE 依赖修复 | 10 个翻译单元的错误路径中不再残留平台头文件 | | 8 | `-fdelayed-template-parsing` | **`bg_pmove.cpp` 已为 `arm64-apple-ios` 编译通过** | 随后的 Mac 启动会话(日志 M7–M11)将普查范围从 2/14 扩大到了 **23/23** — 包含 pthreads 线程、POSIX 文件系统、BSD 套接字网络、 类型化的 Miles stub、空操作的 Steam 后端、iOS 平台入口层, 以及渲染器初始化窗口接缝 — 将 **DXVK 的 d3d9 模块构建为 arm64-apple-ios 静态库**(即之前的“下一个前沿领域”),并将 首批引擎代码链接到应用中,**经验证已在 iPad Pro (M5) 上执行**。 包含确切编译器错误的完整逐搏日志:**[PORT_JOURNAL.md](PORT_JOURNAL.md)** · 当前状态及后续步骤:**[FRONTIER_REPORT.md](FRONTIER_REPORT.md)** ## 架构(选定路径) ``` flowchart LR subgraph Engine ["KisakCOD engine (C++)"] GAME["game / bgame / script VM"] --> RB["gfx_d3d renderer
(D3D9 calls)"] end RB -->|"d3d9.h (proven on iOS SDK)"| DXVK["DXVK d3d9
(native build — next frontier)"] DXVK --> VK["Vulkan"] --> MVK["MoltenVK"] --> MTL["Metal"] MTL --> CAML["CAMetalLayer
(the stub app's layer, working today)"] subgraph iOS ["iOS platform layer"] FS["fs_homepath → Documents/
fs_basepath → app bundle"] GC["GCVirtualController / GCController"] FX["MetalFX spatial upscaler"] end ``` 渲染器遵循**转换**策略(如 C&C Generals iOS 移植版所用):保留引擎的 D3D9 调用,并在 API 边界对其进行转换。作为备选方案,替代性的原生 Metal 重写范围已在 [DEPENDENCY_MAP.md §8](DEPENDENCY_MAP.md) 中界定。 ### 四大已衡量壁垒 1. **32 位布局假设** — 249 个结构体大小断言;fastfile 反序列化流将区块数据直接流入假定指针为 4 字节的结构体中。这是最大的单项成本。 2. **Win32 平台层** — 约 6,900 行代码的窗口/输入/套接字/线程粘合剂;每一个系列都有对应的 POSIX/UIKit 替代方案。 3. **仅限 x86 的二进制 DLL** — Miles Sound、Bink Video、Steam。需要 AVAudioEngine / AVFoundation / 空操作垫片。 4. **73 个内联 x86 `__asm` 代码块** — 需机械式重写为 C/NEON。 ## 仓库导览 | 路径 | 内容说明 | |---|---| | [`ios/`](ios/) | iOS 应用外壳:包含 MetalFX、控制器支持、图形设置菜单、引擎冒烟测试桥接及签名操作手册的 XcodeGen 规范 + Swift/Metal stub([ios/README.md](ios/README.md)) | | [`src/ios/`](src/ios/) | 引擎侧的 iOS 平台层:沙盒路径、平台入口(`sys_ios_main.mm`)、MSVC-CRT/Win32 兼容性头文件、Miles stub | | [`scripts/platform/ios/`](scripts/platform/ios/) | `KISAK_PLATFORM=ios` 工具链标志、DXVK 头文件连接、**`build-dxvk-ios.sh`**(渲染器库)、**`build-engine-lib.sh`**(引擎归档文件)、DXVK iOS 补丁 | | [`scripts/ios/`](scripts/ios/) | 编译普查目标(随着移植推进,文件逐步加入) | | [`.github/workflows/`](.github/workflows/) | iOS stub 构建 + 模拟器启动证明 · 引擎编译普查 · Windows 回归测试构建 | | [PORT_JOURNAL.md](PORT_JOURNAL.md) | 实验日志 — 每次尝试、确切错误、下一个假设 | | [DEPENDENCY_MAP.md](DEPENDENCY_MAP.md) | 每个 Win32/D3D9/x86 依赖 → 其 iOS 替代方案,附带工作量评级 | | [FRONTIER_REPORT.md](FRONTIER_REPORT.md) | 最远的里程碑、硬性阻碍、人类接下来的工作 | | [docs/UPSTREAM_README.md](docs/UPSTREAM_README.md) | 原始 KisakCOD 自述文件(Windows 构建说明) | ## 快速开始 ### 在你的 iPhone 上运行 stub(Mac) ``` git clone https://github.com/Braxton-Bevis/bmk4 brew install xcodegen cd kisakcod-ios-port/ios && xcodegen generate && open KisakStub.xcodeproj ``` 使用你(免费)的 Apple ID 启用自动签名,插上手机,然后运行。详情及免 Mac 的 Sideloadly 路径:**[ios/README.md](ios/README.md)**。 ### 复现引擎编译普查(Mac) ``` cmake -B build-ios -DKISAK_PLATFORM=ios -DCMAKE_SYSTEM_NAME=iOS \ -DCMAKE_OSX_ARCHITECTURES=arm64 -DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 ``` 或者只需在 `src/` 目录下推送更改 — 普查工作流会自动为你运行,并将逐文件错误表作为构件发布。 ### 构建渲染器库 + 引擎归档文件(Mac) ``` # DXVK d3d9 作为 arm64-apple-ios 静态库 (SDL2-iOS WSI, 约 10 分钟) ./scripts/platform/ios/build-dxvk-ios.sh dxvk-ios-work # 将每个通过 census 测试的 engine TU 加入 ios/libs//libkisakcod.a git clone --depth 1 --branch v2.7.1 --recurse-submodules=include/native/directx \ --shallow-submodules https://github.com/doitsujin/dxvk ../dxvk ./scripts/platform/ios/build-engine-lib.sh ../dxvk/include/native both ``` 需要在 PATH 中包含 cmake/meson/ninja/glslang(无需 Homebrew — 请参阅各个 脚本头部的二进制发行版安装单行命令)。 ### 构建原版 Windows 游戏 与上游保持不变 — 参见 [docs/UPSTREAM_README.md](docs/UPSTREAM_README.md)。所有 iOS 相关工作均受 `#ifdef KISAK_IOS` 控制;在涉及引擎源码的每棵代码树中,win32 构建均已在 CI 中验证为成功(绿色)。 ## 路线图 1. ~~作为 arm64-apple-ios 库的 DXVK d3d9~~ ✅ **完成** — `libdxvk_d3d9.a` 已通过 [5 处补丁](scripts/platform/ios/dxvk-v2.7.1-ios.patch)构建;参见 [build-dxvk-ios.sh](scripts/platform/ios/build-dxvk-ios.sh)。 2. ~~pthreads `threads.cpp` → BSD-sockets `win_net.cpp` → 替代 `win_main.cpp` 的平台层~~ ✅ **完成** — 全部经普查验证(`sys_ios_main.mm` 为入口层)。 3. **渲染器运行时启动**(当前前沿领域):将 DXVK + MoltenVK + SDL2-iOS 链接到 stub 中,实现一次从端到端的 D3D9 清除+呈现至 CAMetalLayer。 4. **引擎启动**:将翻译单元逐步推进至无头(headless)模式的 `Com_Init`(dvar、com_memory mmap 移植、common_mp、数据库)。 5. 64 位 fastfile 壁垒 — 加载时的结构体转换;这决定了是否能加载真实游戏数据。随后是在已落地的 `AIL_*` stub 接口背后引入 AVAudioEngine。 ## 鸣谢与法律声明 - [**SwagSoftware/KisakCOD**](https://github.com/SwagSoftware/KisakCOD) — 本项目所基于的非凡反编译项目,以及其自述文件中致谢的每一个人。 - [doitsujin/dxvk](https://github.com/doitsujin/dxvk) + [Joshua-Ashton/mingw-directx-headers](https://github.com/Joshua-Ashton/mingw-directx-headers) — D3D9 转换头文件 · [DLTcollab/sse2neon](https://github.com/DLTcollab/sse2neon) — SSE→NEON(MIT 协议,内置在 `deps/sse2neon` 中)。 - 许可证:**GPL-3.0**(继承自上游)。*Call of Duty® 是 Activision 的商标。本项目不提供任何游戏资产,并且需要您合法获取的 COD4 (2007) 副本。本项目不隶属于 Activision,也未获得其认可。*
标签:Bash脚本, DirectX 9, DXVK, iOS, Metal, 使命召唤4, 游戏引擎, 跨平台移植, 预握手