iOS 设备跟踪 GPU 使用率

关于如何用代码跟踪 App 的 CPU 使用率,网上相关文章已经很多了,但是很难搜索到 GPU 使用率相关的东西。这个原因可能是多样的:

  1. App 开发者一般不太关心 GPU 使用的问题,游戏开发者更关心一些。而游戏开发的有很强大的 Unity 工具可以实时跟踪
  2. 最近的 Xcode 本身也提供了 GPU 跟踪的功能(仅当 App 中存在 OpenGLES Layer 时)
  3. 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 方便后人使用。感谢所有为开源做出贡献的人!

参考资料