“If you can measure it, you can optimize it” is a common term in the computing world, and for Android’s rendering system, the same thing holds true. In order to optimize your pipeline to be more efficient for rendering, you need a tool to give you feedback on where the current perf problems lie.
And in this video, +Colt McAnlis walks you through an on-device tool that’s built for this exact reason. “Profile GPU Rendering” will help you understand the stages of the rendering pipeline, and also get a chance to see what portions of it might be taking too long, and what you can do about it for your application.
GPU Profile工具
渲染性能問題往往是偷取你寶貴幀數的罪魁禍首,這種問題很容易產生,很容易出現,而且在一個非常方便的工具的幫助下,也非常容易去追蹤. 使用Peofile GPU Rendering tool,你可以在手機上就可以看到究竟是什么導致你的應用程序出現卡頓,變慢的情況.
這個工具在設置-開發者選項-Profile GPU rendering選項,打開后選擇on screen as bars:
然后手機屏幕上就會出現三個顏色組成的小柱狀圖,以及一條綠線:
這個工具會在屏幕上顯示經過分析后的圖形數據,最底部的圖顯示的是Navigation的相關信息,最上面顯示的是Notification的相關信息,中間的圖顯示的是當前應用程序的圖.
使用GPU Profile工具
當你的應用程序在運行時,你會看到一排柱狀圖在屏幕上,從左到右動態地顯示,每一個垂直的柱狀圖代表一幀的渲染,越長的垂直柱狀圖表示這一幀需要渲染的時間越長.隨著需要渲染的幀數越來越多,他們會堆積在一起,這樣你就可以觀察到這段時間幀率的變化.
綠線
下圖中的綠線代表16ms,要確保一秒內打到60fps,你需要確保這些幀的每一條線都在綠色的16ms標記線之下.任何時候你看到一個豎線超過了綠色的標記現,你就會看到你的動畫有卡頓現象產生.
柱狀圖
每一條柱狀圖都由三種顏色組成: 藍-紅-黃. 這些線直接和Android的渲染流水線和他實際運行幀數的時間關聯:
-
藍色代表測量繪制的時間,或者說它代表需要多長時間去創建和更新你的DisplayList.在Android中,一個視圖在可以實際的進行渲染之前,它必須被轉換成GPU所熟悉的格式,簡單來說就是幾條繪圖命令,復雜點的可能是你的自定義的View嵌入了自定義的Path. 一旦完成,結果會作為一個DisplayList對象被系統送入緩存,藍色就是記錄了需要花費多長時間在屏幕上更新視圖(說白了就是執行每一個View的onDraw方法,創建或者更新每一個View的Display List對象).
Draw Phase當你看到藍色的線很高的時候,有可能是因為你的一堆視圖突然變得無效了(即需要重新繪制),或者你的幾個自定義視圖的onDraw函數過于復雜.
自定義視圖 -
紅色代表執行的時間,這部分是Android進行2D渲染 Display List的時間,為了繪制到屏幕上,Android需要使用OpenGl ES的API接口來繪制Display List.這些API有效地將數據發送到GPU,最總在屏幕上顯示出來.
紅色記住繪制下圖這樣自定義的比較復雜的視圖時,需要用到的OpenGl的繪制命令也會更復雜
自定義的復雜View當你看到紅色的線非常高的時候,這些復雜的自定義View就是罪魁禍首:
Paste_Image.png值得一提的是,上面圖中紅色線較高的一種可能性是因為重新提交了視圖而導致的.這些視圖并不是失效的視圖,但是有些時候發生了某些事,例如視圖旋轉,我們需要重新清理這個區域的視圖,這樣可能會影響這個視圖下面的視圖,因為這些視圖都需要進行重新的繪制操作.
橙色部分表示的是處理時間,或者說是CPU告訴GPU渲染一幀的地方,這是一個阻塞調用,因為CPU會一直等待GPU發出接到命令的回復,如果柱狀圖很高,那就意味著你給GPU太多的工作,太多的負責視圖需要OpenGL命令去繪制和處理.
保持動畫流暢的關鍵就在于讓這些垂直的柱狀條盡可能地保持在綠線下面,任何時候超過綠線,你就有可能丟失一幀的內容.
總結
GPU Profile工具能夠很好地幫助你找到渲染相關的問題,但是要修復這些問題就不是那么簡單了. 你需要結合代碼來具體分析,找到性能的瓶頸,并進行優化.
有時候你可以以這個為工具,讓負責設計這個產品的人修改他的設計,以獲得良好的用戶體驗.
Perf Matters
keep calm, profile your code, and always remember, Perf Matters