關(guān)于如何用代碼跟蹤 App 的 CPU 使用率,網(wǎng)上相關(guān)文章已經(jīng)很多了,但是很難搜索到 GPU 使用率相關(guān)的東西。這個原因可能是多樣的:
- App 開發(fā)者一般不太關(guān)心 GPU 使用的問題,游戲開發(fā)者更關(guān)心一些。而游戲開發(fā)的有很強(qiáng)大的 Unity 工具可以實(shí)時(shí)跟蹤
- 最近的 Xcode 本身也提供了 GPU 跟蹤的功能(僅當(dāng) App 中存在 OpenGLES Layer 時(shí))
-
Instruments 工具也可以跟蹤設(shè)備上的 GPU 使用率(選擇 Core Animation 可以跟蹤沒有 OpenGLES 的 App 的 GPU 使用率,其它的暫時(shí)沒有試過)
image
然而,跟蹤 App 的 GPU 使用率是有必要的。一些不好的編程習(xí)慣會導(dǎo)致 GPU 占用率上升到 70~80%,已經(jīng)比普通游戲的 20-40% 高出很多,如下圖的列表 Cell 的陰影繪制:

或者濫用 layer.mask 等情況。
GPU 占用過高,一方面導(dǎo)致 App 耗電量增大,另一方面導(dǎo)致卡頓,而這種卡頓是 DisplayLink 方法檢測不出來的(主線程 Runloop 上加的 DisplayLink 實(shí)際上檢測出來的是 CPU Runloop 的卡頓)。
在一陣搜索之后,找到一個開源的 mac 上的系統(tǒng)監(jiān)控軟件 XRG,功能類似 iStat,但界面丑一點(diǎn)。發(fā)現(xiàn)它通過 IOKit 查找系統(tǒng)信息可以獲取 GPU 的使用情況,那同樣的方式是不是可以用到 iOS 呢?
而 IOKit 是私有的框架,沒有任何文檔說明,因而也找不到對應(yīng)的 IOService 名字用于查找。幸運(yùn)地是,又找到另一個開源的工具 IOKitBrowser,可以在真機(jī)上運(yùn)行,按層級瀏覽所有的 Service,并且支持搜索!在搜索關(guān)鍵詞 GPU 后,發(fā)現(xiàn)不同型號的設(shè)備 GPU 不一樣,但它們都共有一個 sgx 父節(jié)點(diǎn),只需做兩層遍歷即可!
整理過后,將本文的工作封裝為一個庫:GPUUtilization 方便后人使用。感謝所有為開源做出貢獻(xiàn)的人!
