小米電池休眠自動解除打開后蓋 小米電池休眠自動解除( 二 )


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 信號基本同時 。

推薦閱讀