l布局是如何一步一步載入到螢幕上的

2021-09-20 10:05:44 字數 2354 閱讀 4809

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幀的渲染工作,以致「延誤軍機」。

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)

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

收藏 分享到:

贊 舉報

一步一步 Sql Azure

一步一步 sql azure 1.使用 windowsazure 平台賬號登陸 2.新建sqlazure server 3.新建資料庫 4.為sql azure server 新增防火牆規則,只有將本機新增到規則裡才能從本機連線到該sqlazure server 5.連線到sql azure ser...

spring AOP 是如何一步一步被簡化的

aop的配置使用 aop的思想實現是基於 設計模式的,動態增加某些功能。因此在最開始階段 1 所有需要被織入的類都需要被 proxyfactorybean 2 切面 advisor 的實現中寫了切點匹配類的規則和匹配方法的規則 3 增強 advise 需要自己實現。proxyfactory 內部使用...

一步一步學cscope

告之 1,我不喜歡寫部落格 因為感覺太浪費時間 2,部落格能記住自己某階段學過的東西,而這些東西可能會很快的忘卻 所以我以後要學著在部落格上浪費時間 前言 本文件記錄了我今天 2007 11 9 下午學習cscope的一點收穫,特收錄部落格以作分享。在學習cscope過程中查閱了大量的文件,但發現適...