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

2021-08-14 08:34:05 字數 3142 閱讀 6368

gpu

gpu用途是將計算機系統所需要的顯示資訊進行轉換驅動,並向顯示器提供行掃瞄訊號,控制顯示器的正確顯示,是連線顯示器和個人電腦主機板的重要元件,也是「

人機對話

」的重要裝置之一。顯示卡作為電腦主機裡的乙個重要組成部分,承擔輸出顯示圖形的任務,對於從事專業圖形設計的人來說顯示卡非常重要。

如果cpu想畫乙個二維圖形,只需要發個指令給gpu,如「在座標位置(x, y)處畫個長和寬為a×b大小的長方形」,gpu就可以迅速計算出該圖形的所有畫素,並在顯示器上指定位置畫出相應的圖形,畫完後就通知cpu 「我畫完了」,然後等待cpu發出下一條圖形指令。

首先,我們要知道

android

系統每隔

16ms

就重新繪製一次

activity

,也就是說,我們的應用必須在

16ms

內完成螢幕重新整理的全部邏輯操作,這樣才能達到每秒

60幀,然而這個每秒幀數的引數由手機硬體所決定,現在大多數手機螢幕重新整理率是

60赫茲(赫茲是國際單位制中頻率的單位,它是每秒中的週期性變動重複次數的計量),也就是說我們有

16ms

(1000ms/60

次=16.66ms

)的時間去完成每幀的繪製邏輯操作,如果錯過了,比如說我們花費

34ms

才完成計算,那麼就會出現我們稱之為丟幀的情況。

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

cpu、

gpu、顯示器三個部分,

cpu負責計算資料,把計算好資料交給

gpu  

負責measure,layout,record,execute等計算操作

gpu會對圖形資料進行渲染,

負責rasterization(柵格化)操作

然後顯示器

負責把buffer裡的資料呈現到螢幕上

southeast

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幀的渲染工作,以致

「延誤軍機」。

從上圖可以看到,cpu和

gpu的處理時間因為各種原因都大於乙個

vsync

的間隔(

16.6ms

),所以在第二個

vsync

還在處理

1區域的繪製時, 試想使用者盯著同一張圖看了

32ms

而不是16ms

,當然很容易察覺出卡頓感,哪怕僅僅出現一次掉幀,使用者都會發現動畫不是很順暢,大家在察覺到

卡頓的時候

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

當中。

過度繪製

案例<item

name=

"android:windowbackground">@nullitem>

或者  getwindow.setbackgrounddrawable(null)

或者將布局設定的白色去掉

Android 布局渲染流程與原理

首先,我們要知道android系統每隔16ms就重新繪製一次activity,也就是說,我們的應用必須在16ms內完成螢幕重新整理的全部邏輯操作,這樣才能達到每秒60幀,然而這個每秒幀數的引數由手機硬體所決定,現在大多數手機螢幕重新整理率是60赫茲 赫茲是國際單位制中頻率的單位,它是每秒中的週期性變...

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

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

cocos2dx渲染流程

二 mainloop drawscene當中統計deltatime,再呼叫排程管理器update,opengl clearbuffer,設定渲染檢視矩陣,投影矩陣和紋理,呼叫當前場景visit 遞迴呼叫子節點 呼叫opengl渲染 前後臺緩衝區交換 呼叫統計函式,呼叫自動釋放池的pop。三 ccme...