如何在iPhone 15 Pro Max(120Hz屏)设置GLKView/MTKView帧率?
解决GLKView/MTKView在ProMotion设备上的120Hz渲染限制
通用前置设置
首先确保App允许突破帧率限制:
- 在Info.plist中添加键
CADisableMinimumFrameDurationOnPhone,设置值为YES,这个配置允许iPhone上的视图突破默认60Hz帧率上限。 - 检查视图所在的
UIWindow,设置其preferredFramesPerSecond = 120,窗口的帧率设置会作为子视图的帧率上限。
GLKView 配置方案
GLKView默认依赖内部CADisplayLink锁定60Hz,需要手动替换为自定义高刷新率驱动:
- 禁用GLKView的自动刷新机制:
self.glkView.enableSetNeedsDisplay = YES; - 创建自定义CADisplayLink并设置120Hz刷新率:
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(triggerGLKRender)]; displayLink.preferredFramesPerSecond = 120; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; - 在DisplayLink回调中触发渲染:
- (void)triggerGLKRender { [self.glkView setNeedsDisplay]; } - 确保GLKView的渲染逻辑能在8.3ms内完成(1/120秒),否则系统会强制降帧。
MTKView 配置方案
手动定时调用setNeedsDisplay的方式存在同步问题,推荐以下两种配置方式:
方式1:自动刷新模式(推荐)
- 解除MTKView的暂停状态(默认处于暂停):
self.mtkView.paused = NO; - 设置目标帧率:
self.mtkView.preferredFramesPerSecond = 120; - 禁用手动触发,让MTKView自动按帧率渲染:
self.mtkView.enableSetNeedsDisplay = NO;
方式2:手动触发模式(需同步DisplayLink)
如果必须手动控制渲染时机,不要用普通定时器,而是用CADisplayLink同步:
- 启用手动触发:
self.mtkView.enableSetNeedsDisplay = YES; self.mtkView.paused = YES; - 创建120Hz的CADisplayLink:
CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(triggerMTKRender)]; displayLink.preferredFramesPerSecond = 120; [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; - 回调中触发渲染:
- (void)triggerMTKRender { [self.mtkView setNeedsDisplay]; }
额外注意事项
- 低电量模式下,ProMotion会自动切换到60Hz,测试时确保设备电量充足且关闭低电量模式。
- 检查渲染管线耗时,比如GPU计算、纹理加载等操作,如果单帧耗时超过8.3ms,系统会自动降帧到60Hz,可通过Xcode的Instrument工具(Core Animation/Metal System Trace)排查性能瓶颈。
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

