小米电池休眠自动解除打开后盖 小米电池休眠自动解除( 二 )


ProMotion 屏幕在这种情况下可以主动降低刷新率,减少屏幕功耗,这对于移动设备来说尤其重要 。
动态刷新率的表现形式The iPhone 13 Pro, the iPhone 13 Pro Max, and the iPad Pro ProMotion displays are capable of dynamically switching between:
Faster refresh rates up to 120Hz
Slower refresh rates down to 24Hz or 10Hz
已知,ProMotion 屏幕的刷新帧率并不固定,系统会实时地根据当前显示内容的类型和状态来动态切换屏幕的刷新帧率 。为了更好地理解这种动态帧率的表现形式,笔者分别在
iPhone XR - 无 ProMotioniPhone 13 Pro - 有 ProMotion 默认锁频上对一些典型渲染场景进行了测试,发现搭载了 ProMotion 屏幕的设备上运行 App 时,不同的场景下的各种统计口径的帧率指标确实展示出了有趣的变化 。
具体而言,笔者分别在以下几种场景:
测试场景静态页面静态的 UIView,无动画/视频等元素
2.滑动中的页面
包含静态 Cell 的 UITableView,仅观察滑动中的表现
3.Core Animation 默认刷新率动画
显示基于 CABasicAnimation 实现的简单位移动画
4.Core Animation 120Hz 高刷新率动画
仅在 ProMotion 设备上测试,基于 CABasicAnimation 实现的简单位移动画,同时解锁了 CADisableMinimumFrameDurationOnPhone 和 preferredFrameRateRange 帧率限制 。(关于此限制下文会有具体介绍)
5.Metal 渲染 30Hz/60Hz 视频
使用基于 MTKView 进行渲染的播放器,播放源帧率分别为 30Hz/60Hz 的视频文件
并使用以下几种统计口径的帧率指标进行测试:
测试指标CADisplayLink 计算帧率iOS 中主要的帧率统计手段 。
根据 CADisplayLink.h 头文件中描述,CADisplayLink 是一个 ”Class representing a timer bound to the display vsync “ 。在回调中比较当前帧/前一帧的时间戳,可以计算出上一帧的渲染耗时(ts),其倒数(1/ts)即为当前的实时帧率 。
2.Xcode GPU Report 帧率
Xcode -> Show Debug Navigator -> FPS 中显示的帧率 。这个只能统计当前应用直接通过 OpenGL ES 或者 Metal 进行绘制的帧率,例如游戏渲染/视频播放,无法统计 Core Animation 的帧率(众所周知,后者通过 backboardd 进行绘制) 。
3.Instruments Core Animation FPS
Instruments 中 Core Animation FPS 工具所显示的帧率 。这个统计的是 Core Animation 的帧率,即 Render Server backboardd 绘制的频率 。目前该工具有 BUG 无法显示高于 60 FPS 的帧率 。
4.Instruments Display/VSync 信号频率
Instruments 中 Display 工具所显示的 Surface/VSync 信号时间戳 。如下图所示:

小米电池休眠自动解除打开后盖  小米电池休眠自动解除

文章插图
Display:指对应显示器的单个 Surface 上屏持续的时间,对应 CPU-GPU 管线的渲染频率VSync:指垂直同步信号时间戳,对应屏幕硬件的刷新频率在 60Hz 屏幕上,iOS 设备默认采用双缓冲刷新机制,也就是前帧缓存和后帧缓存 。GPU 总是在后帧缓存上进行当前帧的绘制 。当 VSync 信号到来时,交换前后帧缓存的指针(Swap FrameBuffer),屏幕刷新显示新的内容 。
而当屏幕以 120Hz 显示内容时,iOS 会切换成三缓冲刷新机制(见上图中三种颜色的 Surface),这减少渲染管线的压力,但同时会增加一定的渲染上屏延迟 。
Metal 应用可以通过设置 -[CAMetalLayer setMaximumDrawableCount:] 为 2 来在 120Hz 屏幕上强制启用双缓冲机制,避免这种延迟 。
如果屏幕显示内容未发生变化,Surface 则不会发生交换,一个 Surface 的 Display 可能持续数个 VSync 间隔,但多余的 VSync 信号依然代表着硬件层额外的屏幕刷新,造成额外的电量消耗 。
非 ProMotion 设备首先让我们看看传统的固定刷新率的设备的情况 。
VSync 信号间隔固定为 16.67msXR 的屏幕刷新率为固定的 60Hz,这一点对应的具体指标是 VSync 信号的间隔,而在任何场景下,XR 的 VSync 信号的间隔均为固定的 16.67ms 。
此外,在显示静态内容时,由于视图 Layer Tree 无变化,Core Animation 不会有提交新的事务提交,backboardd 不会进行刷新,所以对应这一帧的 Surface 也长时间(数十秒)未被交换下去,Core Animation FPS 的值显示为 0 。
但由于 VSync 信号仍然以 60Hz 的频率持续触发,屏幕此时正在不停重复展示同样的 Frame Buffer,消耗了额外的电量 。
CADisplayLink 基本完全跟随 VSync 信号根据过去对 iOS 系统的认知,我们知道 CADisplayLink 是由 VSync 信号驱动的:
小米电池休眠自动解除打开后盖  小米电池休眠自动解除

文章插图
默认配置的 CADisplayLink 的回调应该与 VSync 信号基本同时 。

推荐阅读