Android 布局渲染流程與原理

2021-09-07 19:45:29 字數 2705 閱讀 6547

首先,我們要知道android系統每隔16ms就重新繪製一次activity,也就是說,我們的應用必須在16ms內完成螢幕重新整理的全部邏輯操作,這樣才能達到每秒60幀,然而這個每秒幀數的引數由手機硬體所決定,現在大多數手機螢幕重新整理率是60赫茲(赫茲是國際單位制中頻率的單位,它是每秒中的週期性變動重複次數的計量),也就是說我們有16ms(1000ms/60次=16.66ms)的時間去完成每幀的繪製邏輯操作,如果錯過了,比如說我們花費34ms才完成計算,那麼就會出現我們稱之為丟幀的情況。

在乙個典型的顯示系統中,

cpu、gpu、顯示器三個部分,

cpu負責計算資料,把計算好資料交給gpu  負責measure,layout,record,execute等計算操作

gpu會對圖形資料進行渲染, 負責rasterization(柵格化)操作

然後顯示器 負責把buffer裡的資料呈現到螢幕上

android  vsync原理

以時間的順序來看下將會發生的異常:

step1. display顯示第0幀資料,此時cpu和gpu渲染第1幀畫面,而且趕在display顯示下一幀前完成

step2. 因為渲染及時,display在第0幀顯示完成後,也就是第1個vsync後,正常顯示第1幀

step3. 由於某些原因,比如cpu資源被占用,系統沒有及時地開始處理第2幀,直到第2個vsync快來前才開始處理

step4. 第2個vsync來時,由於第2幀資料還沒有準備就緒,顯示的還是第1幀。這種情況被android開發組命名為「jank」。

step5. 當第2幀資料準備完成後,它並不會馬上被顯示,而是要等待下乙個vsync。

所以總的來說,就是螢幕平白無故地多顯示了一次第1幀。原因大家應該都看到了,就是cpu沒有及時地開始著手處理第2幀的渲染工作,以致「延誤軍機」。

android  gpu

設計的緩衝機制

button轉換成特定的向量圖形是乙個時間消耗過程,再由向量圖形傳遞給gpu又是乙個時間消耗過程,而由cpu傳遞給gpu同樣是乙個非常耗時的過程。這樣就意味著,gpu中進行柵格化所節省下來的時間,可能在這裡被消耗大半。

幸運的是open gl考慮到了這一點,它提供了乙個類似快取到機制:cpu上傳到gpu中的資源,可以作為緩衝儲存在gpu當中,在下次再次利用的過程中,就省去了cpu的格式轉換和cpu上傳到gpu的過程消耗。

android系統就靈活利用到了這一點,它在系統啟動過程中,就將主題中的系統資源以乙個單一向量圖形的形式上傳至gpu,以後在呼叫系統資源時,就可以直接在gpu中取到相應資源,而不需要轉換和傳遞。這就是載入android系統為啥這麼快的原因。

然而,有了這個機制就可以萬事大吉了?並不,隨著ui畫的圖越來越詭異,產品設計的動畫越來越彪悍,gpu的緩衝機制變得幾乎形同虛設,因為每乙個都是不同的,都無法服用,因此gpu中的快取資源只能通過不斷被覆蓋來達到相應效果,

android系統提供了差異化繪製機制,簡單來說就是快取的舊資源與即將寫入的新資源進行對比,只對發生了改變的部分進行重新處理。以此緩解gpu的壓力。

在上面,我們有提到,有displaylist對cpu處理好的格式資源以及需要進行的相應的繪製指令,進行接收。這裡的dispalylist在特殊情況下,可以對其接收的資訊進行復用,舉例來說:

如果乙個button改變了其位置:gpu可以將displaylist中的資訊可以進行復用。

如果乙個button改變了其大小或者其形狀,表面顏色發生改變(視覺上的形體,色彩改變 ):gpu就無法使用之前cpu傳遞來的displaylist,需要通過cpu進行重新格式轉換,然後將命令和轉換好的資源存入乙個新的displaylist當中。

lint建議

我們看到優化布局是一項非常繁瑣複雜的工作,所以我們平時在開發中一定要注意。

出了使用hv和li兩種工具之外,我們還可以使用lint檢查,讓lint給出存在問題的地方來修改(activity_main4)。

然後彈出框

選擇lint檢查的範圍

按照lint的提示修改布局即可。

Lsn2 布局渲染流程與原理 2018 1 3

gpu gpu用途是將計算機系統所需要的顯示資訊進行轉換驅動,並向顯示器提供行掃瞄訊號,控制顯示器的正確顯示,是連線顯示器和個人電腦主機板的重要元件,也是 人機對話 的重要裝置之一。顯示卡作為電腦主機裡的乙個重要組成部分,承擔輸出顯示圖形的任務,對於從事專業圖形設計的人來說顯示卡非常重要。如果cpu...

UI繪製優化之布局渲染流程與原理

1 cpu 的任務繁多,做邏輯計算外,還要做記憶體管理 顯示操作,因此在實際運算的時候效能會大打折扣,在沒有 gpu 的時代,不能顯示複雜的圖形,其運算速度遠跟不上今天覆雜三維遊戲的要求。即使 cpu的工作頻率超過 2ghz 或更高,對它繪製圖形提高也不大。這時 gpu的設計就出來了。2 cpu與g...

android的幾種渲染與裁剪

import android.content.context import android.graphics.bitmap import android.graphics.bitmapshader import android.graphics.canvas import android.graph...