WWDC Quick Look 💓 By SwiftGGTeam
Level up your games

Level up your games

观看原视频

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 是系统在低电量模式开关变化时投递的通知名,监听它就能拿到切换事件。
  • isLowPowerModeEnabledProcessInfo 上的只读属性,用来判断当前是否处于低电量模式。
  • 收到通知后建议降低画质档位、关闭后处理特效、降低分辨率,把帧率优先保住。

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 新增 Insights20: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

评论

GitHub Issues · utterances