- 每個豎條都是一次VSync的時間16.6ms,如果豎條寬度變寬且透明則代表超出16.6ms繪制的幀
- 每個Vsync信號來臨前都會做工作(Choreographer中的postFrameCallback函數),按照順序依次處理: 「INPUT 輸入處理」 , 「Animation動畫處理」 ,「Traversal 最終會調用到perfor的measure,layout,draw方法」
- 每個豎條中的不同顏色代表的上面每個步驟的處理時間
顏色區分
image.png
從下到上說明
INPUT 輸入處理
表示應用執行輸入事件回調中的代碼所花的時間。如果此區段很大,表示應用花太多時間處理用戶輸入。不妨考慮將此類處理任務分流到其他線程。
建議:
其實就是處理輸入事件開始到結束的時間,如果豎條中此顏色高度過高代表輸入事件應放到其他線程去做
Animation動畫處理
表示評估運行 「該幀的所有動畫程序所花的時間」 。如果此區段很大,表示您的應用可能在使用性能欠佳的自定義動畫程序,或因更新屬性而導致一些意料之外的工作。
建議:
該幀內運行的動畫比較多
Measure,Layhout
表示在視圖層次結構中 onLayout 和 onMeasure回調上所花的時間。大區段表示處理視圖層次結構需要很長時間。
Measure用來確定View的寬高,當View為ViewGroup的時候還需要遍歷子View,Layout在進行遍歷擺放到正確的位置,當View嵌套層級變多或者自定義View時復寫這兩個方法時也要考慮這種情況。
Draw
表示用于創建和更新視圖顯示列表的時間。如果豎條的此部分很高,表明可能有許多自定義視圖繪制,或 onDraw 方法執行的工作很多。
上篇文章 Vsync信號和View繪制流程的關系中說到:draw方法其實并沒有進行真正的繪制,而是把繪制的內容放入到了DisplayList中接著同步到RenderThread中。放入到DisplayList的命令其實就是對canvas的操作轉換而來的,該列表命令過多有兩種情況:1.可用的渲染數據失效。2.canvas的操作過多
將對Canvas的操作轉換成Bitmap同步至GPU
表示將位圖信息上傳到 GPU 所花的時間。大區段表示應用花費大量的時間加載大量圖形。
draw方法調用完成后,會進行釋放這塊內存區域并交給RenderThread去處理渲染數據。(釋放的操作在native層對應的處理是把這塊內存區域變成一個Bitmap交由RenderThread去渲染) 「幀的所有資源都必須位于 GPU 內存中才能用來繪制幀」 ,因此需要上傳到GPU中緩存起來
要減小該值,可以采用以下技巧:
- 確保位圖的分辨率不會比位圖的顯示尺寸大很多。應避免將 1024x1024 的圖片顯示為 48x48 的圖片。
- 利用
prepareToDraw()
在下一個同步階段之前異步預上傳位圖。
RenderThread進行調用Opengl渲染
這個顯示列表就是DisplayList
表示 Android 的 2D 渲染程序向 OpenGL 發出繪制和重新繪制顯示列表的命令所花的時間。此豎條的高度與執行每個顯示列表所花的時間的總和成正比。顯示列表越多,紅色豎條就越高。
發出將顯示列表繪制到屏幕上所需的全部命令所需的時間
RenderThread會執行一個DrawFrameTask的Task,里面核心方法是DrawFrame。通過OpenGl和一些庫將渲染數據通知給SurefaceFliger去做圖層合成。將渲染數據放入到阻塞隊列中。
這個和上面的要區分開,官方文檔我沒看太明白,我以我的理解闡述一下吧:
繪制的耗時不代表對canvas的操作復雜,可能僅僅是邏輯處理,但是調用OpenGl渲染反映的是對canvas的操作復雜,所以一個是說OnDraw復雜,一個是說對canvas操作的復雜,在加上其實Android會進行緩存。
在某些情況下,滾動、轉換或動畫會要求系統重新發送顯示列表,但不必實際重新構建它(即重新捕獲繪制命令)。因此,您可能會看到“發出命令”條較高,但“繪制命令”條并不高。
交換緩沖區
表示 CPU 等待 GPU 完成其工作的時間。如果此豎條升高,表示應用在 GPU 上執行太多工作。
當 Android 將其所有顯示列表提交給 GPU 后,系統會發出最后一條命令,告訴圖形驅動程序它已完成當前幀的處理。此時,驅動程序即可將更新后的圖像顯示到屏幕上。
GPU提交數據給SuraceFliger讓其顯示,接著CPU在吧數據給到GPU進行處理,這個區間就是CPU給到GPU的時間
最后給出官方的解析:
如果 CPU 發出命令的速度快于 GPU 處理命令的速度,這兩個處理器之間的通信隊列就會被占滿。出現這種情況時,CPU 會阻塞并等待,直到隊列中有位置來放置下一個命令。這種隊列占滿狀態通常出現在“交換緩沖區”階段,因為此時已提交了整個幀的命令。緩解此問題的關鍵是降低 GPU 工作的復雜度
-
gpu
+關注
關注
28文章
4760瀏覽量
129134 -
函數
+關注
關注
3文章
4343瀏覽量
62806 -
渲染
+關注
關注
0文章
70瀏覽量
10933
發布評論請先 登錄
相關推薦
評論