最近遇到Android性能優化問題,使用AS的profile看了下堆棧,“nSyncAndDrawFrame 耗時過長”,然後打開GPU渲染分析,紅色線條很長。
GPU渲染時的每個顏色代表的意義如下:
一般主要看深綠色和紅色就行,意義如下:
- 第一步是由應用程序進程的Main Thread構建Display List,即updateRootDisplayList方法,對應Gpu呈現模式分析的深綠色線條,其中軟件渲染的子視圖需要先繪製在一個Bitmap上,然後這個Bitmap再記錄在父視圖的Display List中,繪製的視圖內容越多,構建Display List的耗時越長
- 第二步由應用程序進程的Render Thread渲染Display List,即nSyncAndDrawFrame方法,對應Gpu呈現模式分析的紅色線條,其中執行渲染需要得到Main Thread的通知,此通知在Main Thread與Render Thread信息同步完畢後發出。信息同步過程中,Display List引用到的Bitmap會封裝成Open GL紋理上傳至GPU。當全部Open GL紋理上傳完畢,說明引用到的Bitmap全部同步完成。同樣,繪製的視圖內容越多,則引用到的Bitmap越大,進而導致上傳耗時增加,Render Thread執行渲染等待通知的時間也就相應變長
profile頁面有個更清晰易懂的描述。
YouTube上有個這塊的視頻,描述DisplayList是什麼以及如何生成和繪製,大小改變如何影響DisplayList重繪。推薦觀看。
https://www.youtube.com/watch?v=we6poP0kw6E&index=64&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
此外這個視頻是“Android Performance Patterns”的一部分,推薦下這個視頻合集,一共79個,不過可惜的是隻更新到16年8月。
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
參考:
https://juejin.im/post/5a32b099f265da432c23e1d3
https://developer.android.com/studio/profile/inspect-gpu-rendering
https://developer.android.com/topic/performance/rendering/profile-gpu.html
https://www.youtube.com/watch?v=we6poP0kw6E&index=64&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE
https://www.youtube.com/playlist?list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE