将高级游戏移植到 Apple 平台
Port advanced games to Apple platforms
2024年6月10日
一句话判断
如果你在做 Windows 游戏向 Mac/iPad/iPhone 的移植工作,这场 Session 直接给你一套从评估到上线的完整工具链和最佳实践,Game Porting Toolkit 2 是今年最值得关注的游戏开发工具更新。
这场 Session 讲了什么
去年 Apple 推出了第一代 Game Porting Toolkit(GPTK),让 Windows 游戏在 Apple Silicon 上运行变得前所未有地简单。《Death Stranding Director’s Cut》就是用这套方案成功登陆了 Mac、iPad(M 系列芯片)和 iPhone 15 Pro。今年 GPTK 2 带来了全面升级:评估环境现在支持 AVX 指令集、光线追踪,图形和计算的兼容性进一步提升,性能表现也更接近最终移植版本。
整个移植流程被清晰地划分为三个阶段。第一阶段是评估,你可以在不改一行代码的情况下,直接把 Windows 游戏扔进评估环境,看看在 Apple Silicon 上的基线性能和 Shader 转换情况。第二阶段是移植本身,GPTK 2 提供了一套完整的示例代码项目——不是那种只能看不能跑的伪代码,而是一个可以在 Xcode 中直接 build & run 的 2D 游戏,涵盖了图形、Shader、音频、手柄输入等所有子系统。第三阶段是调试和性能分析,Metal 工具现在可以直接调试你原始的 HLSL Shader 源码,不管你是在评估 Windows 二进制还是在调 Metal 版本。
另一个重点是对多设备的统一支持。通过 Unified Metal Shaders,你可以编译一次 Shader 就同时部署到 macOS 和 iOS。Metal Device 初始化 API 也是统一的,加上 Device Certification API 可以根据设备性能等级动态调整游戏配置。
值得深挖的点
GPTK 2 的示例代码项目设计值得每个游戏开发者学习
这个示例项目不是简单的代码片段堆砌,而是一个完整的交互式教程系统。项目按功能模块组织成独立文件夹——GameInput、Graphics、Shaders、Audio 等——每个文件夹包含一节课加配套代码。比如打开 GameInput 文件夹,你能看到所有处理手柄输入的代码文件,README 文件详细说明了如何为游戏添加输入支持。
最巧妙的地方在于,所有章节的代码最终汇聚成一个可运行的完整 2D 游戏。这意味着你既能按需学习单个模块,也能看到所有技术如何协同工作。项目已经配置好同时支持 macOS 和 iOS target,在 Xcode 里切换 destination 就能在 iPhone 或 iPad 上跑起来。这种设计把”学习”和”实践”之间的摩擦降到了最低。
Game Mode 登陆 iOS 带来的性能优化思路
今年 Game Mode 从 Mac 扩展到了 iOS。开启后,系统会降低后台活动频率、减少蓝牙延迟,从而改善输入响应和耳机延迟。iOS 18 可能自动为你的游戏启用 Game Mode,但如果你想确保万无一失,可以在 Info.plist 中主动声明。这个设计思路值得注意:系统在帮你做性能优化,前提是你得告诉系统”我是个游戏,请给我优先待遇”。对于已经在 Mac 上用过的开发者来说,这个 API 的迁移成本几乎为零。
代码片段
跨平台项目配置中的 Target Conditional
// 使用编译条件区分平台特定代码
#if os(macOS)
// macOS 特定的应用生命周期处理
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
setupMetalRenderer()
}
}
#elseif os(iOS)
// iOS 特定的应用生命周期处理
class AppDelegate: NSObject, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
setupMetalRenderer()
}
}
#endif
场景:当你需要让同一份代码在 macOS 和 iOS 上走不同的应用启动流程时。坑点:别忘了在 Xcode 的 File Inspector 里用 SDK Filter 设置文件的目标平台,共享文件选 “Always Used”,平台特定文件才需要做过滤。
统一 Metal Shader 编译
// 这个 Shader 文件同时适用于 macOS 和 iOS
// 在 GPTK 2 中,通过 Metal Shader Converter
// 可以直接从 HLSL 转换得到
#include <metal_stdlib>
using namespace metal;
vertex float4 vertex_main(device const float3* positions [[buffer(0)]],
uint vid [[vertex_id]]) {
return float4(positions[vid], 1.0);
}
fragment float4 fragment_main(constant float4& color [[buffer(0)]]) {
return color;
}
场景:GPTK 2 的 Unified Metal Shader 让你编译一次就部署到 macOS 和 iOS。坑点:如果你的 HLSL Shader 用了平台特有的 intrinsic 函数,转换时需要检查兼容性。
设备性能等级查询
// 根据设备能力动态调整游戏配置
let device = MTLCreateSystemDefaultDevice()!
// 查询设备性能等级来决定画面设置
if device.supportsFamily(.appleGPU) {
// 高端设备:启用光线追踪、高分辨率纹理
gameSettings.enableRayTracing = true
gameSettings.textureQuality = .ultra
} else {
// 降低配置以保证帧率
gameSettings.enableRayTracing = false
gameSettings.textureQuality = .medium
}
场景:游戏需要在不同性能等级的设备上都能流畅运行。坑点:别只看 GPU family,还要考虑设备的散热能力和电池状态,这些都会影响实际可用的 Display Headroom。
最佳实践
- 先评估再动手:移植前务必用评估环境跑一遍原始 Windows 二进制,拿到基线性能数据。如果评估阶段的帧率就不理想,先解决 Shader 转换问题再开始正式移植。
- 善用 Xcode 的多 target 配置:大多数游戏代码是共享的,用 “Always Used” 过滤器就行。只有应用生命周期、平台特定 API 调用才需要做区分。
- Metal-cpp 让 C++ 开发者无缝衔接:如果你不想在游戏引擎里混入 Objective-C/Swift,Metal-cpp 提供了完整的 C++ 接口覆盖 Metal API。
- 参考 Human Interface Guidelines 的游戏部分:GPTK 2 新增了专门的游戏 HIG 章节,涵盖首次启动体验优化、字体在不同 Apple 设备上的可读性等实际问题。
- HLSL 调试现在全流程可用:从评估环境的 Windows 二进制到最终的 Metal 版本,你都可以在 Xcode 里直接调试原始 HLSL 源码,不用在两个工具链之间切换。
还有什么值得关注
- 社区已经基于 GPTK 构建了 Whisky、Homebrew 等项目以及 CrossOver 等产品,评估环境的生态比官方文档展示的更丰富。
- 《Design advanced games for Apple platforms》这个相关 Session 专门讲了移植时的用户体验设计考量,和本 Session 的技术内容互补。
- Metal Developer Tools for Windows 让你在 Windows 端就能完成 Asset 构建管线对 Apple 平台的适配,不用来回切换操作系统。