如何在iPhone 13 Pro上让SceneKit实现120Hz刷新率?
SCNView开启120Hz ProMotion刷新率遗漏配置说明
- 首先确认基础运行条件:必须使用iOS 15.0及以上系统,搭配iPhone 13 Pro/Pro Max、后续iPhone Pro系列、2018款及以后iPad Pro实机测试,模拟器不支持ProMotion高刷新率特性。
- 补充Info.plist配置:除了设置
CADisableMinimumFrameDurationOnPhone = YES外,iOS 15.4及以上系统还要求添加CAPreferredFrameRateRange字典类型字段,内部配置三个子项:CAPreferredFrameRateRangeMinimum:数值类型,填1CAPreferredFrameRateRangeMaximum:数值类型,填120CAPreferredFrameRateRangePreferred:数值类型,填120
- 调整SCNView帧率设置时机:不要在
viewDidLoad生命周期方法中设置preferredFramesPerSecond,需要等视图关联到UIWindow层级后再设置,推荐放在viewDidAppear:方法中执行scnView.preferredFramesPerSecond = 120,避免配置被系统默认值覆盖。 - 父容器同步配置:如果SCNView嵌套在UIScrollView、UINavigationController、UITabBarController等容器组件内部,需要同步将所有父容器的
preferredFramesPerSecond属性设置为120,系统会取整个视图层级中最低的帧率上限作为实际调度值。 - 排除性能瓶颈影响:如果以上配置完成后帧率仍未达标,可以先加载空SCNScene测试,排除场景本身渲染负载过高、GPU性能不足导致的帧率上不去问题。同时可以检查设备是否开启了低功耗模式,低功耗模式下系统会强制限制最高刷新率为60Hz。
- 验证方式:不要完全依赖SCNView的
showsStatistics统计值,可以通过CADisplayLink监控实际刷新率,示例代码如下:
// Swift 实现 let displayLink = CADisplayLink(target: self, selector: #selector(monitorFps(link:))) displayLink.add(to: .main, forMode: .common) @objc private func monitorFps(link: CADisplayLink) { print("实际屏幕刷新率:\(Int(1/link.duration))Hz") }
// Objective-C 实现 CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(monitorFps:)]; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; - (void)monitorFps:(CADisplayLink *)link { NSLog(@"实际屏幕刷新率:%ldHz", (long)(1/link.duration)); }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

