使用了私有 APIFPS 指标从此不再适用VSync 信号目前和渲染流程不完全匹配 , 虽然精确但不一定实用方案三 [Pick]通过在 CADisplayLink 回调中确认 duration 参数,计算得到当前屏幕的实时刷新率,并修改 preferredFrameRateRange 来进行跟踪 。
优点:
方案相对简单,只需在每次回调中更新 DisplayLink 对象的 preferredFrameRateRange 属性即可
缺点:
由于动态帧率的存在,FPS 指标可以反映实时屏幕刷新情况,但是聚合后的意义不大,消费时需要区分特定机型/场景观察到目前的最小回调频率为 60Hz , 也就是说无法确认 ProMotion 屏幕在 48Hz、30Hz 甚至更低刷新率下的表现在低刷新率时,MainRunLoop 依然会以 60Hz 运行,对功耗有一定影响需要注意的是,CADisplayLink 的 preferredFrameRateRange 需要以类似一下格式进行设置:
NSInteger currentFPS = (NSInteger)ceil(1.0 / displayLink.duration);displayLink.preferredFrameRateRange = CAFrameRateRangeMake(10.0, currentFPS, 0.0);CAFrameRateRange.minimum 传最小值 10.0 , preferred 传 0.0,可以让该 CADisplayLink 只用于监控当前的系统帧率,而不影响帧率的动态选择 。
相比前两个方案,方案三改动小 , 不使用私有 API,监控准确性也较高,缺点相对来说可以接受 。
FPS 的替代指标考虑到在 ProMotion 屏幕上 FPS 指标不再与应用运行是否流畅直接相关 , 它的聚合值参考价值不大,有必要寻找一个新指标作为替换 。
Apple 官方在 WWDC20 - 10077 Eliminate animation hitches with XCTest 中介绍了 Hitch Time Ratio 这一概念,并着重说明了它比单纯的 FPS 更能适配不同刷新率的场景 。
在 XCTest 框架中,苹果提供了 API XCTOSSignpostMetric 帮助开发者在单测中即时地获取该指标,但相关 API 尽在单测中提供,线上无法使用 。而 MetricKit 中的 MXAnimationMetric 尽管可以在线上获?。?但却不是实时的 , 无法满足大型 App 对不同场景的监控需求 。
因此,遵循下面 Apple 对 Hitch Ratio 的定义:
Hitch time:
Time in ms that a frame is late to display.
Hitch time ratio:
Hitch time in ms per second for a given duration.
笔者尝试实现了基于 CADisplayLink 的 (Scroll) Hitch Time Ratio 的计算方案:
计算上一帧的帧时间戳与上上一帧的目标帧时间戳得到上一帧的 Hitch Time确定该帧是否是在滑动中渲染累计得到整体的 Hitch Frame,与累积的帧间隔相比,得到 (Scroll) Hitch Time Ratio关键场景提升帧率在测试过程中笔者发现,系统 App 滑动时是稳定以最高刷新率 120Hz 运行的:
而第三方 App 即便设置了 CADisableMinimumFrameDurationOnPhone 为 true 也无法稳定以满帧率滑动(经过验证,这一点在 iOS 15.4 beta 系统上依然成立) 。
通过利用 iOS 15 引入的新 API,我们可以在关键场景如滑动、转场、动画过程中主动解锁更高/限制更低的动态帧率,从而优化流畅度或者优化功率,提升用户体验目标 。
滑动中稳定 120Hz首先,笔者希望非系统 App 也可以尽可能实现滑动中稳定 120Hz 刷新 。
结合上述分析 , 这一点可以用 CADisplayLink 来实现 。这里笔者提出两种可能方案仅供参考:
创建 CADisplayLink,配置其 preferredFramesPerSecond 为 120,然后将其添加到 UITrackingRunLoopMode 中 。CADisplayLink *dp = ...dp.preferredFramesPerSecond = 120;// 或者dp.preferredFrameRateRange = CAFrameRateRangeMake(120.0, 120.0, 0.0);[dp addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode];在滑动中 , 该 CADisplayLink 被激活,系统锁定当前帧率为最高 120Hz(仅在内容中高速变化时生效) 。停止滑动时则恢复正常帧率 。
推荐阅读
- 小米手机怎么查看本机号码显示未知 小米手机怎么查看本机号码
- 小米9网络不好怎么办
- 锂电池电动车怎样充电更耐用 锂电池电动车怎样充电更耐用些
- 小米手机在哪调屏幕亮时间 小米手机怎么调屏幕亮的时间
- bf3电池是vivo什么型号的手机,vivo电池型号b_f3是哪个型号手机
- 雅迪石墨烯电池正确充电方法 雅迪石墨烯电池正确充电方法图片
- 12ah电池能跑多远 60v12ah电池能跑多远
- 小米新旗舰双11降价:首批澎湃OS+4nm旗舰芯+IP68,不到2500拿下
- 捡来的手环怎样恢复出厂设置 小米手环3怎么恢复出厂设置
- 小米note3清除数据 红米note3怎么清除数据
