Highlight
这场 Session 把 Apple 这一年给游戏开发者的更新打了个包:Game Mode、Sustained Execution Mode、GameSave、Touch Controls、Background Assets、MetalFX 升级到帧插值与降噪,最后是 Metal 4 与新版 Performance HUD。
核心内容
游戏开发者在 Apple 平台上经常被同一类问题反复劝退:包体太大用户下载到一半就放弃;玩家在 Mac 上打到一半切到 iPhone 进度没了;同一份代码在 iOS 上调成 60 帧,跑十分钟降频到 40 帧,体验崩塌。这些都不是图形 API 的问题,是平台级基础设施的问题。
今年 Apple 把这些洞一个一个填掉。Game Mode 让游戏拿到更多 CPU 和更低的蓝牙延迟,只要在 info.plist 里加一个 LSSupportsGameMode 键;Sustained Execution Mode 从启动那一刻就把性能锁在稳态,开发者再也不用赌玩家会不会玩到第十分钟掉帧;GameSave 框架直接基于 iCloud 做存档同步,开发者不用自己维护一套云存储;Background Assets 把启动包拆成”教程关 + 后台下载剩余内容”,玩家点开就能玩。图形侧 Metal 4 接管低层 API,MetalFX 新增帧插值与光追降噪,Performance HUD 现在能直接告诉你”你这帧卡是因为 shader 正在运行时编译”。
详细内容
Low Power Mode 监听(04:02)。macOS 26 会在游戏耗电过高时提示玩家切换低电量模式,玩家也能在 Game Overlay 里动态切换。游戏侧需要主动响应这个状态切换:
static let NSProcessInfoPowerStateDidChange: NSNotification.Name
var isLowPowerModeEnabled: Bool { get }
关键点:
NSProcessInfoPowerStateDidChange是系统在低电量模式开关变化时投递的通知名,监听它就能拿到切换事件。isLowPowerModeEnabled是ProcessInfo上的只读属性,用来判断当前是否处于低电量模式。- 收到通知后建议降低画质档位、关闭后处理特效、降低分辨率,把帧率优先保住。
GameSave 接入(12:13)。GameSave 框架基于 iCloud Documents,玩家在 Mac 上保存,到 iPhone 打开自动同步。接入只要两步:在 Xcode 里勾选 iCloud Documents capability,加上 container entitlement,剩下交给 API。
// Objective-C GameSave code sample
#import <GameSave/GameSave.h>
NSString* containerIdentifier = ///… container entitlement string, nil specifies the first in the entitlement array
GSSyncedDirectory* directory = [GSSyncedDirectory openDirectoryForContainerIdentifier:containerIdentifier];
/// Where statusDisplay is an NSWindow or UIWindow where the alert will be anchored to
[directory finishSyncing:statusDisplay completionHandler:^{
}];
GSSyncedDirectoryState* directoryState = [directory directoryState];
switch (directoryState.state) {
case GSSyncStateError:
error = directoryState.error;
break;
default:
NSLog(@"Sync has finished");
}
NSURL* saveURL = directoryState.url;
关键点:
openDirectoryForContainerIdentifier:用 entitlement 里的 iCloud container 标识打开同步目录,传nil表示用 entitlement 数组里的第一个。返回值GSSyncedDirectory是后续所有操作的句柄。finishSyncing:completionHandler:在后台拉取最新存档;statusDisplay传一个NSWindow/UIWindow,框架会把进度提示和冲突解决 UI 锚定到这个窗口上,开发者不用自己写。directoryState拿到当前同步状态,GSSyncStateError分支处理网络异常、未登录 iCloud 等失败情况,其余情况就是同步完成。directoryState.url是真实可读写的存档目录路径,游戏从这里读 / 写文件即可,剩下的同步、冲突、登出处理都由框架兜底。
性能与图形管线(15:04)。Metal 4 降低了编码命令的 CPU 开销,可以把机器学习嵌进渲染管线。MetalFX 这次三件套同时上:空间 / 时间向上采样、帧插值生成中间帧、光追降噪允许”少打几条光线再补回画质”。CD Projekt Red 用这一套让 Cyberpunk 2077 在 M4 Max MacBook Pro 上跑出明显更高的帧率。
Performance HUD 新增 Insights(20:00)。HUD 现在能识别”你的 shader 在运行时编译导致掉帧”这种典型问题,给出指向文档的建议,并支持把一段时间的指标聚合成 offline 性能报告。原生游戏和 Evaluation Environment for Windows Games 跑的移植版都能用。
核心启发
-
做什么:游戏 info.plist 加上
LSSupportsGameMode = true,再申请 Sustained Execution Mode entitlement。- 为什么值得做:成本几乎为零,但能让玩家获得更多 CPU 时间和更稳定的帧率曲线。Sustained Execution Mode 把性能锁在稳态,QA 测出的帧率就是玩家最终拿到的帧率,不会出现”前五分钟惊艳、之后降频崩盘”。
- 怎么开始:Xcode 里勾选 Game Mode 和 Sustained Execution 两个 capability,重新打包测一遍。
-
做什么:用 GameSave 框架替换自建的云存档方案。
- 为什么值得做:iCloud 同步、冲突 UI、未登录降级、跨设备恢复,这些都是自己实现至少一个月的工作量;GameSave 把它们打包成几行 API。对小团队而言,这是真正”用平台能力换工程预算”的场景。
- 怎么开始:先在新项目或新模块里 spike 一遍
openDirectoryForContainerIdentifier:→finishSyncing:→ 读directoryState.url这个三步流程,确认能在两台设备间同步存档,再考虑迁移老项目。
-
做什么:把游戏拆成”教程包 + Background Assets”两段下载。
- 为什么值得做:高端游戏首包动辄几个 GB,下载等待是首日流失的主要原因之一。Managed Background Assets 提供最多 200 GB 的 Apple 托管容量,TestFlight 可以单独灰度内容更新而不重打主包。
- 怎么开始:先把游戏资产做一次”启动必需 vs. 可后台下载”的分类,然后接入 Managed Background Assets API,再观察 TestFlight 里玩家进入第一关的时间分布。
-
做什么:把 Metal Performance HUD 接入开发版构建,并打开 Performance Insights。
- 为什么值得做:以前定位掉帧要切到 Instruments 抓 trace,现在 HUD 直接在游戏画面上指出”shader 正在运行时编译”这类高频问题,并附文档链接。
- 怎么开始:在 dev build 里默认开启 HUD,把 Shader Compiler 这一项打开;发现 insight 之后用 offline 性能报告留档,方便回归对比。
关联 Session
- Discover Metal 4 — Metal 4 的新 API、资源管理与机器学习入门
- Combine Metal 4 machine learning and graphics — 把 ML 推理嵌进渲染管线,配合 MetalFX 提升画质
- Engage players with the Apple Games app — 让你的游戏出现在新版 Games app 与 Game Overlay 里
- Bring your SceneKit project to RealityKit — SceneKit 弃用后把 3D 项目迁移到 RealityKit 的路径
评论
GitHub Issues · utterances