首頁>技術>

CPU 與 GPU 的關係

圖形API允許CPU直接與GPU,需要透過中間層來連結

CPU 把display list放入佇列

中間層維護一個佇列

GPU 從中間層取出佇列進行繪製

GPU渲染工具

Android開發者選項中提供了Profile GPU Rendering功能,用於在螢幕上實時顯示GPU渲染每一幀影象花費的時間(單位:ms)。

GPU渲染分析: GPU-RENDERING-PROFILE

豎條=繪製每一幀所消耗的時間

不同的顏色代表UI繪製的不同階段

並且在柱狀圖的中間還有一根綠色的橫線代表16ms的繪製時間基準

GRP會統計並顯示app最近執行的128幀

渲染時間用柱狀圖表示,上面的綠線代表16ms,也就是要儘量保證所有柱狀圖都在這條線下方。每一條柱狀圖都由3部分組成,藍色、紅色和橙色,代表渲染的3個不同的階段,透過分析這三個階段的時間就可以找到渲染時的效能瓶頸。

藍色條碼解析

藍色條碼 解析

藍色條碼含義:View需要先轉換為GPU能識別的格式 ,對所有需要更新的view完成這兩步花費的時間。 表示繪製時間或者在Java層建立和更新display list的時間。在一個View實際被渲染前,它需要先轉換為GPU能識別的格式。簡單來說可能就是幾個繪製命令,複雜一點,我們可能在嵌入了一條從canvas獲取的自定義路徑。這一步完成之後,輸出結果就會被系統作為display list快取起來。

若藍色條碼高時可能的原因有:

view突然無效(invalidate),onDraw函式中做了複雜的繪製邏輯

紅色條碼解析:

紅色條碼含義:渲染引擎OpenGL處理DISPLAYLIST,將處理結果傳遞給GPU的執行時間,為了將變化繪製在螢幕上,Android需要使用OpenGL ES API來繪製這些display list資訊,OpenGL最終將資料傳給了GPU,然後GPU渲染到螢幕上。View越複雜,OpenGL繪製所需要的命令也越複雜。

紅色較高可能的原因:

view過於複雜,view重複提交

橙色條碼解析:

橙色色條碼含義:cpu在等待gpu完成工作的過程,就是CPU告訴GPU渲染已經完成的時間。。

橙色較高可能的原因:

GPU任務太多,複雜的view繪製

不同顏色的含義

安卓官網對於不同顏色的解釋

墨綠色 MiscTime/VSync Delay

代表在連續兩幀間的時間間隔,可能是因為子執行緒執行時間過:長搶佔了UI執行緒被cpu執行的機

會.

深綠色 Input Handing

代表app在使用者輸入事件回撥中花費的時間,這部分過高可能意味著app處理使用者輸入事件時間:

過長,建議將操作分流到工作執行緒.

綠色 Animation

代表為該幀內所有animator求值(屬性動畫中代表透過估值器計算屬性的具體值)所花費的時間.如果

這部分過高,代表自定義animator效能不佳或者更新view屬性引發了某些意外操作.

淡綠色 Measure/Layout

代表了onLayout和onMeasure方法消耗的總時間,這段很高代表遍歷整個view樹結構花費了太多

時間.

深藍色 draw

代表建立更新DisplayL ist的時間,過高代表在onDraw中花費過多時間,可能是自定義畫圖操作太多

或執行了其它操作.

淺藍色 sync&upload

向CPU傳輸Bitmap花費的時間,過高代表了載入了大量圖形.

紅色 command Issue

Android 2D渲染器向OpenGL發出命令繪製或重繪花費的時間,條碼的長度等於所有Display list繪製時間的總和

橘色 swap buffers

代表qpu在等待gpu完成工作,如果過高代表GPU需要完成的工作過多

men統計

記憶體耗用名詞解析

VSS Virtual Set Size 虛擬耗用記憶體 (包含共享庫佔用的記憶體)

RSS Resident Set Size 實際使用物理記憶體 (包含共享庫佔用的記憶體)

PSS Proportional Set Size 實際使用的物理記憶體(比例分配共享庫佔用的記憶體)

USS Unique Set Size 程序獨自佔用的物理記憶體(不包含共享庫佔用的記憶體)

各指標解析

VSS:衡量虛擬記憶體大小無太大用處,無法知道分配的物理記憶體大小

RSS:各程序的RSS相加,會超過系統記憶體使用量

PSS:各程序的PSS之和,就是系統的記憶體使用量

USS:是PSS中自己的部分,不包含任何共享的部分

記憶體大小佔用規律

VSS>=RSS>=PSS>=USS

procstats:

adb shell dumpsys procstats - -hours 3

程序詳情:

程序名稱/USER/VersionCode

狀態: (minPSS -avgPSS-maxPSS/minUSS -avgUSS -maxUSS over samples)

輸入欄位解析

百分比:表示在總的時間內,程序在各種狀態下的消耗

例如,1000,就指在這段時間內,這個程序是一直處於運行當中的

TOTAL:表示了程序的綜合佔用情況

Imp Fg:載入到前臺

Service:標識了是否是服務

Persistent: 標識了是否一直駐留在記憶體當中,與Service一樣,表示記憶體進駐的級別。

Top:標識了是否是頂層程序

Receiver:標識了是否是廣播程序。

檢視指定程序的mem:

adb shell dumpsys meminfo com.xueqiu.android

因為安卓常駐系統應該較多,所有版本比對的形式來分析記憶體佔比更加準確

37
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 為什麼我還是堅持用C/S架構來開發企業應用?