View繪製流程和加載過程(一)

屏幕的刷新包括三個步驟:CPU 計算屏幕數據、GPU 進一步處理和緩存、最後 display 再將緩存中(buffer)的屏幕數據顯示出來。
在這裏插入圖片描述

WindowManager 維護着所有 Activity 的 DecorView 和 ViewRootImpl。

scheduleTraversals()就是屏幕刷新的關鍵,用於安排一次繪製 View 樹的任務等待執行。

  • 一個 View 發起刷新的操作時,會層層通知到 ViewRootImpl 的 scheduleTraversals() 裏去,然後這個方法會將遍歷繪製 View 樹的操作 performTraversals() 封裝到 Runnable 裏,傳給 Chorerographer,以當前的時間戳放進一個 mCallbackQueue 隊列裏,然後調用了 native 層的方法向底層註冊監聽下一個屏幕刷新信號事件。

  • 當下一個屏幕刷新信號發出的時候,如果我們 app 有對這個事件進行監聽,那麼底層它就會回調我們 app 層的 onVsync() 方法來通知。當 onVsync() 被回調時,會發一個 Message 到主線程,將後續的工作切到主線程來執行。

  • 切到主線程的工作就是去 mCallbackQueue 隊列里根據時間戳將之前放進去的 Runnable 取出來執行,而這些 Runnable 有一個就是遍歷繪製 View 樹的操作 performTraversals()。在這次的遍歷操作中,就會去繪製那些需要刷新的 View。

FrameDisplayEventReceiver繼承自DisplayEventReceiver,用於接收底層的VSync信號,開始處理UI過程。VSync信號由SurfaceFlinger實現並定時發送。FrameDisplayEventReceiver收到信號後,調用onVsync方法組織消息發送到主線程處理。這個消息主要內容就是run方法裏面的doFrame了,這裏mTimestampNanos是信號到來的時間參數。

所以說,當我們調用了 invalidate(),requestLayout(),等之類刷新界面的操作時,並不是馬上就會執行這些刷新的操作,而是通過 ViewRootImpl 的 scheduleTraversals() 先向底層註冊監聽下一個屏幕刷新信號事件,然後等下一個屏幕刷新信號來的時候,纔會去通過 performTraversals() 遍歷繪製 View 樹來執行這些刷新操作。

參考:
Android 的屏幕刷新機制
面試官又來了:你的app卡頓過嗎?
android屏幕刷新顯示機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章