iPhone13 Pro设备SpriteKit设60Hz掉帧但120Hz运行正常问题求助
问题根因
这是搭载ProMotion自适应刷新率屏幕的iPhone 13 Pro系列在iOS 15上的已知SpriteKit帧调度bug,和你的代码性能无关:
- 未开启高刷权限时,系统给SpriteKit渲染队列分配的vsync对齐窗口存在偏移,会随机错过单帧同步信号,导致平均帧率稳定落在55-56fps区间
- 辅助功能开启限制帧率后,系统会强制全局刷新率锁为60fps,刚好触发了同样的调度偏移逻辑,所以能稳定复现问题
- 你手动开启高刷权限并设置
preferredFramesPerSecond为120后,系统会切换到高优先级的渲染调度队列,对齐逻辑恢复正常,所以帧率能跑满。
适配方案
方案1(推荐,兼容全设备)
- 在Info.plist中添加键
CADisableMinimumFrameDurationOnPhone,值设置为YES开启高刷权限 - 代码中动态设置帧率,自动适配设备最高刷新率:
if #available(iOS 15.0, *) { // 读取设备支持的最高刷新率自动适配 view.preferredFramesPerSecond = UIScreen.main.maximumFramesPerSecond } else { // iOS15以下设备统一用60fps view.preferredFramesPerSecond = 60 }
该方案在无高刷的旧设备上会自动回退到60fps,也不会触发调度bug,同时ProMotion设备可以跑满120fps的流畅度。
方案2(仅需保留60fps时可选)
如果不需要支持120fps,可以在SKScene加载完成后,延迟100ms再重新设置一次preferredFramesPerSecond = 60,即可绕开初始化阶段的调度偏移问题,无需开启高刷权限。
内容的提问来源于stack exchange,提问作者Manny
相关产品推荐
相关产品推荐

