前段时间收到某游戏发热严重, 这是一个非常模糊的表达, 或者说这里面包含的变量信息太多了, 如何一层层抽丝剥茧排除一些关键性的变量就变得尤为重要.
本篇文章就详细的记录下整个分析过程与解决方案, 并采用自问自答的方式, 进行讲解, 方便大家遇到类似问题有自己的一套方法论.
文章本身并不涉及详细技术细节,只提供源码,具体技术原理可以私下沟通.
3.1 温度只能用于宏观趋势, 并不能精准量化(量化标准的建立)
3.2 自研游戏和竞品游戏到底有多少差距?(建立参考系)
3.3 什么原因引发了上面差异?(分析原因)
3.4 围绕着GPU我们能做什么分析?(进一步分析原因)
3.5 耗电占比分析(找出凶手)
4.1 温度对于我们就没有参考价值了么?
4.2 Android温度采样系统
4.3 结合自动化建立温度监控系统
为了建立统一的测试环境, 我们必须排除除游戏以外的其他关键性因素, 这里罗列出以下相关因素,保持标准一致. 后面所有的性能测试和数据分析都基于这个测试环境:
通过我们长时间的数据对比测试, 温度的上升和下降都是一个缓慢的过程, 并且明显有滞后性. 但是瞬时功耗的反馈更加灵敏, 因此我们最开始采用了功耗作为发热的量化.
下面是我简单画的一个草图, 描述对应的映射关系, 实际的生产环境相关数据都有毛刺.
有了相对统一的测试环境, 我们就需要开始进行数据采集, 量化我们的竞品之间的差距. 这里我们采用了从用户时长和功耗这两个角度进行数据对比:
通过上面的数据进行简单对比,我们可以得出第一个结论: 我们从各个方面都弱于竞品.
通过上面的数据,我们仅仅只是建立了感官认知, 并不能能够帮助我们去解决问题. 我们需要数据进一步分析游戏到底什么原因引发了功耗比竞品高.
针对游戏而言, 发热的核心原因有两个:
围绕这上面两个核心, 我们进行了对应的数据采集工作, 发现 CPU 的使用率和竞品差距不大, 但是功耗和温度比竞品高. 因为我们得出了第二个结论: 自研游戏的发热是由 GPU 引起的
GPU 的综合指标是 GPU 的使用率, 更详细的重要指标有 GPU 带宽, 顶点数, 顶点计算和 OverDraw, Shader 的复杂度等.
高通的 Snapdragon 为我们提供了详细的 GPU 性能指标, 同时给我们一个非常的重要的信息,GPU 温度. 这个后面再做详细阐述.
针对游戏而言各个地方都可能引起发热问题, 这里我们采用 A/BTesting 方法针对不同的游戏案例进行数据分析, 此处包含游戏效果和不同的游戏系统, 图里面已经列出了所有的相关分析测试.
有了上面的理论基础, 我们就能够针对性的进行耗电占比分析, 然后就能针对性的分析不同效果, 并进行优化处理. 下图就简单列出了不同模块对应不同的耗电占比
简单对比就给我们指出了明确的优化方向, 我们进一步分析得出 MSAA 4x 耗电非常高,, 于是我们就把工作重心放在后处理上面了. 当然其他模块也各自有各自的问题
做游戏优化简单来说就是做游戏平衡, 每个地方优化一点点, 效果就非常显著了.
在我们我们使用 Snapdragon 进行了 GPU 温度数据采集,与 CPU 温度差值相比, 发现温度差距很大 15 度左右. 这也就进一步说明我们应该把工作重心放在 GPU 端.
前面已经提到过, 功耗的反映更灵敏, 温度具有滞后性, 但是当我们详细了解 Android 电源管理系统后, 我们把温度也纳入对应的监控指标.
电源管理系统参考文章:
https://stackoverflow.com/questions/31446740/how-to-use-the-new-android-batterymanager-api
https://github.com/MicroKibaco/BatteryCanary
手机厂商一般会在手机的关键性位置添加温度传感器,其中包括电池温度传感器, CPU 温度传感器, GPU 温度传感器, Linux 通过文件系统机制能够让我们方便读取对应的温度信息,
手机的所有温度采集都在/sys/class/thermal/thermal_zone 目录下, 其中我们采集了 thermal_battery,bms,pm8150_tz,aoss0-usr,cpuss-0-usr,cpuss-1-usr,gpuss-0-usr,gpuss-1-usr
性能优化是一个长期的过程, 因此我们结合每日自动化建立了对应的监控系统, 并开发了数据分析系统,方便进行横向比较和纵向比较.
下面是我们积累点滴优化, 并进行每日跟踪的曲线图, 非常方便我们你进行数据验证和数据回测.
https://github.com/king3soft/UAutoIDE
https://github.com/yhnu/note/tree/master/gpu_temp
发热本身千变万化, 我们需要能够控制变化, 一层层抽丝剥茧才能分析问题. 至于如何解决问题那便是仁者见仁,智者见智的事情了.
在分析发热的问题过程中, 我们详细了解和掌握了高通的 GPU 采集原理, 并开发出了采集器与自动化工具结合. 这样就建立了完善的 CPU 分析器, GPU 分析器, 内存分析器