Reed's News
← 返回精选

使用Fable将《命令与征服:将军》原生移植到苹果设备

Tech 74 asronline 2026/7/4 984 字 原文 ↗

IMG_3457_500

《零点行动》原生支持Apple Silicon芯片Mac、iPhone及iPad —— 包含战役、遭遇战与将军挑战模式,专为RTS(即时战略游戏)打造触控操作:点选、框选、长按取消选择、双指滚动、捏合缩放。无需模拟器:这是基于2003年原版引擎编译的ARM64原生版本,渲染链路为DirectX 8 → DXVK → Vulkan → MoltenVK → Metal。

本项目基于EA发布的GPL v3源码开发,依托一系列社区成果搭建而成——包括TheSuperHackersFighter19的初代Unix移植版,以及fbraz3/GeneralsX。在此基础上,我们新增了iOS/iPadOS移植功能,并修复了若干引擎问题。各模块的开发贡献者详见开发脉络与致谢。原版GeneralsX的README文档可在upstream-main分支查看。

本项目未包含或分发任何游戏资源。您需自行拥有游戏副本(可通过Steam购买,促销价约5美元)。

用“移植”一词远不足以形容这段历程的曲折,以下是真实的开发挑战。此前的社区工作已搭建好基础:EA的源码发布、社区对引擎的现代化改造、Fighter19的初代Unix移植、GeneralsX的macOS/Linux适配。但iOS平台的适配完全是一片空白——对于一款2003年的Windows RTS而言,iOS的运行环境堪称“ hostile”:

  • 引擎默认安装目录具备可写权限,但iOS应用位于只读且经过代码签名的包内。所有配置写入、缓存及存档路径都需重新规划,工作目录也需从应用包中重新初始化。
  • 引擎采用DirectX 8渲染,而iPad仅支持Metal。中间需要通过DXVK将D3D8转换为Vulkan,再通过MoltenVK将Vulkan转换为Metal——但DXVK从未针对iPhoneOS编译过。为此我们采用Meson交叉编译,并修改了其Vulkan加载器(补丁文件为Patches/dxvk-ios.patch),因为iOS限制dlopen仅能访问应用包内文件。
  • iOS完全掌控应用进程。打开应用切换器时,系统会抢占Metal绘图资源,但不会将应用转入后台——若此时再绘制一帧,恢复应用时就会崩溃。整个渲染/模拟循环必须学会“暂停呼吸”,适配这一机制。
  • RTS游戏需要鼠标操作。SDL3(来自前述社区基础项目)可提供原始触摸事件,但在此之上的RTS操作逻辑需要全新开发:点击操作需延迟至2003年原版GUI处理完悬停事件后执行(否则菜单按钮无法高亮),拖拽操作需区分“框选”与“平移视角”,长按操作映射为右键点击,取消触摸时绝不能误触发集结点点击。
  • 漫长的bug排查——这也是最有成就感的环节。比如小地图全黑,原因是2003年的纹理格式回退逻辑会悄悄丢弃Alpha通道;EVA语音随机静音,是因为某个僵尸音频流一直占用着“语音播放时禁止其他音效”的全局标志,却只发出无意义的杂音。每一个bug都在真机上追根溯源、修复,并反馈给上游项目。

→ 开发故事:移植手册第8章——bug考古学

→ 完整工程日志:

docs/port/PORTING_PLAYBOOK.md→ 移植其他游戏的方法:

docs/port/PORTING_PATTERNS.md需要明确说明:本项目是人类与AI协作的成果。C++开发、交叉编译、设备调试等工程工作由Claude Code(Anthropic公司Claude模型的Fable版本)完成,人类负责指导开发、进行测试,并描述诸如“小地图全黑”“有杂音”等问题,最终拍板所有决策。双方缺一不可:一方不会写C++,另一方听不到杂音。

前置环境配置(仅需执行一次):

# 工具链
xcode-select --install
brew install cmake ninja meson pkgconf
brew install --cask steamcmd
# vcpkg(需完整克隆——浅克隆会破坏依赖清单基线)
git clone https://github.com/microsoft/vcpkg ~/vcpkg && ~/vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=~/vcpkg # 添加到shell配置文件中
# LunarG Vulkan SDK(请勿使用Homebrew cask版本)—— https://vulkan.lunarg.com/sdk/home
export VULKAN_SDK=$HOME/VulkanSDK/<version>/macOS # 添加到shell配置文件中

克隆代码、编译、获取资源、开始游戏:

git clone https://github.com/ammaarreshi/Generals-Mac-iOS-iPad.git GeneralsX
cd GeneralsX
./scripts/build/macos/build-macos-zh.sh # 检查依赖、配置项目、编译
./scripts/build/macos/deploy-macos-zh.sh # 创建~/GeneralsX/GeneralsZH目录及run.sh脚本
./scripts/get-assets.sh <your_steam_username> # 获取您已购买的游戏数据
cd ~/GeneralsX/GeneralsZH && ./run.sh -win

在macOS前置环境基础上,iOS开发还需:完整Xcode(已登录Apple ID)、brew install xcodegen,以及一个(免费或付费的)Apple Developer团队账号。

cd GeneralsX
git submodule update --init references/fbraz3-dxvk # iOS版DXVK基于此子模块及Patches/dxvk-ios.patch构建
./scripts/build/ios/fetch-moltenvk.sh # 获取固定版本的MoltenVK.framework(带校验)
./scripts/build/ios/stage-fonts.sh # 准备Liberation字体,并按游戏要求重命名
cmake --preset ios-vulkan
cmake --build build/ios-vulkan --target z_generals
GX_TEAM_ID=<your-team-id> GX_BUNDLE_ID=com.you.generalszh \
./scripts/build/ios/package-ios-zh.sh --install # 打包、签名并安装到设备

您可在Xcode → 设置 → 账户中找到团队ID。游戏资源会打包进应用包(独立安装);使用--dev参数可跳过约2.7GB的资源复制,加快代码迭代速度。

路径 说明
docs/port/PORTING_PLAYBOOK.md 本次移植的完整工程日志:记录了所有故障模式、根本原因及修复方案——推荐从第8章:bug考古学开始阅读,了解小地图全黑、EVA语音静音、杂音等问题的解决过程
docs/port/PORTING_PATTERNS.md 将经典Windows游戏移植到Apple平台的通用方法论
docs/port/RELEASE_CHECKLIST.md 公开发布前的检查清单
scripts/get-assets.sh Steam资源获取脚本(获取您已购买的游戏副本,应用ID:2732960)
scripts/build/macos/scripts/build/ios/ 编译、部署、打包流水线脚本
ios/ XcodeGen签名桩项目及ios/config/目录(包含预配置的Options.ini和dxvk.conf)
Patches/dxvk-ios.patch 用于构建iOS版d3d8/d3d9动态库的DXVK修改补丁(在本地分支构建时自动应用)
  • 在iPad上长时间游玩可能因内存占用过高(约3GB以上)被iOS强制终止,应用会直接返回主屏幕且无提示。会话日志(当前及上一次)可在“文件”应用的游戏目录下查看,该问题正在排查中。
  • iOS平台上,游戏中途切换到后台偶尔会崩溃——虽然已针对常见场景处理了生命周期暂停逻辑,但仍存在罕见的竞争条件。建议经常存档。

《将军》的移植站在巨人的肩膀上。而同为EA 2002年发布、基于同一GPL源码的**《命令与征服:变节者》**,处境则艰难得多:其W3D引擎从未有过原生macOS或iOS版本(目前Mac玩家只能通过基于Wine的兼容层运行)。OpenW3D社区项目已完成了扎实的跨平台基础工作——包括DXVK封装框架和SDL3构建流程——并将Mac/Linux适配纳入 roadmap,我们的移植正是基于这些基础。

我们沿用了本项目的方法论,但难度更大:为OpenW3D的Win32兼容框架新增了约3000行代码(引擎直接调用Windows原生API进行文件查找、键盘状态读取、COM操作),为2万个资源路径制定了大小写敏感策略,完成了DXVK/MoltenVK渲染器适配、音视频栈移植,以及FPS游戏的触控操作开发。目前该游戏已可在Mac和iPhone上运行,支持战役、过场动画及任务脚本。对比工作量:本次《将军》移植在GeneralsX基础上新增约2200行代码;而《变节者》在Windows-only源码基础上新增了约6700行代码。

相关代码仓库即将发布,我们会像本项目致谢社区一样,对OpenW3D的贡献给予充分认可。同样遵循以下规则:GPL v3协议、需自行拥有游戏副本、提供完整工程日志。

本次移植是漫长社区贡献链中的最新一环,早期的贡献者完成了本项目赖以生存的基础工作:

  • Westwood / EA Pacific——开发了游戏本体;
  • EA——发布了GPL v3授权的源码;
  • TheSuperHackers/GeneralsGameCode- feliwir- OpenSAGE),本项目音频栈基于其开发的OpenAL音频设备实现;
  • Fighter19/CnC_Generals_Zero_Hour
  • fbraz3/GeneralsX
  • 本分支——完成了iOS/iPadOS移植(arm64-ios交叉编译、iOS版DXVK适配、触控操作、应用生命周期管理、打包)及引擎修复,并将成果反馈给上游项目;
  • DXVK、MoltenVK、SDL、OpenAL Soft、FFmpeg、Liberation Fonts——项目的核心依赖组件。

引擎代码采用GPL v3协议(基于EA发布的源码 → 上述社区贡献链 → 本分支)。游戏资源:未包含在本项目中,相关授权另行约定。