关于如何用代码跟踪 App 的 CPU 使用率,网上相关文章已经很多了,但是很难搜索到 GPU 使用率相关的东西。这个原因可能是多样的:
- App 开发者一般不太关心 GPU 使用的问题,游戏开发者更关心一些。而游戏开发的有很强大的 Unity 工具可以实时跟踪
- 最近的 Xcode 本身也提供了 GPU 跟踪的功能(仅当 App 中存在 OpenGLES Layer 时)
- Instruments 工具也可以跟踪设备上的 GPU 使用率(选择 Core Animation 可以跟踪没有 OpenGLES 的 App 的 GPU 使用率,其它的暂时没有试过)
然而,跟踪 App 的 GPU 使用率是有必要的。一些不好的编程习惯会导致 GPU 占用率上升到 70~80%,已经比普通游戏的 20-40% 高出很多,如下图的列表 Cell 的阴影绘制:
或者滥用 layer.mask
等情况。
GPU 占用过高,一方面导致 App 耗电量增大,另一方面导致卡顿,而这种卡顿是 DisplayLink 方法检测不出来的(主线程 Runloop 上加的 DisplayLink 实际上检测出来的是 CPU Runloop 的卡顿)。
在一阵搜索之后,找到一个开源的 mac 上的系统监控软件 XRG,功能类似 iStat,但界面丑一点。发现它通过 IOKit 查找系统信息可以获取 GPU 的使用情况,那同样的方式是不是可以用到 iOS 呢?
而 IOKit 是私有的框架,没有任何文档说明,因而也找不到对应的 IOService 名字用于查找。幸运地是,又找到另一个开源的工具 IOKitBrowser,可以在真机上运行,按层级浏览所有的 Service,并且支持搜索!在搜索关键词 GPU
后,发现不同型号的设备 GPU 不一样,但它们都共有一个 sgx
父节点,只需做两层遍历即可!
整理过后,将本文的工作封装为一个库:GPUUtilization 方便后人使用。感谢所有为开源做出贡献的人!