屏幕刷新機制(一):機制
屏幕刷新機制(二):Choreographer、SurfaceFlinger
綜述
- 屏幕整體刷新機制:就是通過Choreographer、SurfaceFlinger,以垂直同步技術(VSYNC)加三重緩沖技術(Triple Buffer)的方案,保證CPU計算/GPU渲染(MainThread RenderThread)與屏幕刷新率(HWComposer)的平衡與穩定。通過軟件技術連通計算硬件與顯示硬件,維持穩定的固定頻率刷新。
- 每一幀處理的流程:接收到 Vsync 信號回調-> UI Thread –> RenderThread –> Choreographer –> SurfaceFlinger –> HardwareComposer
- UI Thread 和 RenderThread 完成 App 一幀的渲染Buffer,SurfaceFlinger負責合成,HardwareComposer負責合成與顯示。Choreographer 負責調度。
- MainThread:我們的各種操作,包括每一幀的渲染操作 ,都是通過 Message 的形式發給主線程的 MessageQueue ,MessageQueue 處理完消息繼續等下一個消息。主要負責生產 SurfaceFlinger 合成所需要的 Surface
- Choreographer 是線程單例的,而且必須要和一個 Looper 綁定,因為其內部有一個 Handler 需要和 Looper 綁定,一般是 App 主線程的 Looper 綁定
- 渲染層(App)與 Vsync 打交道的是 Choreographer,而合成層與 Vsync 打交道的,則是 SurfaceFlinger。
概念
- 硬件
- CPU:三大繪制流程中Surface的計算。
- GPU:以SurfaceFlinger服務的形式工作,將CPU計算好的Surface數據合成后放到buffer中,讓顯示器進行讀取
- 屏幕刷新率:屏幕在1s內去buffer中取數據的次數,單位為HZ。主流屏幕刷新頻率是每秒60次,高的有90,120等。
- 軟件
- 60 fps 的意思是說,畫面每秒更新 60 次,也就是 16.67 ms 刷新一次
- 協調計算硬件計算頻率,與屏幕能做到的刷新率一致
用戶感知
- 卡頓:如果主線程 + 渲染線程每一幀的執行都超過 16.6ms(60fps 的情況下),那么就可能會出現掉幀、丟幀。如果是APP端沒有及時渲染,而BufferQueue中還有未消費的緩沖,可能就不會有掉幀現象。
- 畫面撕裂:幀率和屏幕刷新率的不一致導致的,不會丟失。
- ANR:如果界面線程被阻塞超過幾秒鐘時間(根據組件不同 , 這里的閾值也不同),用戶會看到 “應用無響應” (ANR) 對話框(部分廠商屏蔽了這個彈框,會直接 Crash 到桌面)
系統刷新機制
- Android 4.1加入垂直同步技術(VSYNC),以及三重緩沖技術(Triple Buffer)
- VSync(垂直同步信號)(Vsync-App Vsync-SF lockAsync)
- 硬件屏幕保持固定頻率會發出的一個脈沖信號
- 提醒CPU立即進入屏幕繪制過程;提醒GPU進行buffer的交換
- Vsync-SF:將所有準備好的 Buffer 取出進行合成
- Triple Buffer
- 一個用于GPU的合成,一個用于屏幕的刷新,一個在Jank時最大限度避免CPU空閑
- 會有前后交換buffer,沒有準備好的情況Jank。此時,需要第三個buffer最大限度避免CPU空閑的情況。