性能优化(38)——发布优化——耗电量与发热量优化


 

准备

  • 测试手机的耗电量与发热量前,需要检测手机电池是否健康。健康度是否良好,是优化的前提
  • 除了一些手机自带的电池健康度、温度接口外,还可通过第三方工具进行检测,如XCode的耗电量分析、UPR的耗电与电池温度监测等

功耗与发热量优化

  • 功耗与手机发热的本质依旧是性能优化问题,现代手机芯片都会设定一个手机临界温度,在手机触发这个温度墙时,系统为了保护硬件,会对芯片做降频处理,这直接会导致手机运行游戏时出现掉帧的情况。一般来说,一些大型3D手游都会遇到这个温度墙。降频后,随着硬件温度的下降,系统还会让芯片恢复正常的频率。我们的优化主要是推迟触碰到温度墙后的降频发生时间,以及让这个降频时间缩短

  • 温度过高是导致系统降频的直接原因,导致温度升高的原因有:

  • 抛开我们控制不了的部分,针对于手机发热问题,我们只能从CPU、GPU负载、显示、GPS、网络通讯与IO、屏幕亮度方面去优化了

常规负载优化

  • CPU负载
  • GPU负载
  • 性能优化都可以理解为是CPU负载、GPU负载的优化

  • 当游戏锁60帧时,CPU开销控制在 10-12ms GPU开销控制在 6-8ms
  • 当游戏锁30帧时,CPU开销控制在 18-20ms GPU开销控制在 8-10ms
    几乎是不会遇到温度墙的

  • 即使你的开销超过个推荐数值,也要尽量控制不让GPU的负载超出太多,CPU可以适当放宽,更高的开销带来的发热量一般GPU比CPU大

非常规优化

  1. 网络与IO
  • 发包频率
    • 需要通过端口和IP区分哪些是真正意义上的网络通讯开销
  • 频繁IO读写
    • 一些网络游戏本身通讯量不高,或根本就是单机游戏,但由于使用第三方的广告平台或信息收集平台的SDK后,也会开启一些网络线程,并进行非常频繁且大量的数据通讯,这块带来的发热问题也不容小觑,需要额外关注有没有一些设置来调整这些SDK
  1. 显示亮度与FPS
  • 现在大多数高端手机都以拥有高亮度的手机屏幕为追求,其实在绝大多数手机游戏运行时,完全没有必要开启最高亮度,甚至为了减少屏幕发热,需要在开启游戏后,将屏幕亮度控制在一定范围内。在一段时间待机的情况下,甚至要大幅度调低手机屏幕亮度以节省电量、减少屏幕与电池的发热量
  • 针对手机游戏显示帧率的问题,一定要按需控制帧率,有些没有必要锁60帧的游戏类型,完全可以采用锁30帧的方式
  • 在全屏UI或模态对话框覆盖屏幕时,可以将原来30帧的显示帧率调整为一半,将60帧的显示帧率调整为原来的1/4
  • 甚至在待机状态,屏幕亮度调暗的情况下,可以调整到个位数的帧率,更激进一点的做法,可以同时调低显示分辨率。这一方式对于一些发热严重的手机及其有效
  • 调整显示帧率不要通过Application.targetFrameRate来进行调整,而是通过Unity提供的OnDemandRendering接口的renderFrameInterval来调整,因为Application.targetFrameRate调整后会导致显示频率与输入频率一起下降,一些更新逻辑也会变慢,而OnDemandRendering接口只会调整显示频率,你的输入不会感觉到有任何延迟
  1. 三方库
  • Wwise
    • 目前很多移动平台游戏都会选择Wwise作为音乐解决方案,这套库本身就很重,后台回开启多个长度线程进行解码与异步操作,并且该库在默认设置下并不会控制多音源混合个数,当混合个数较多时,开销呈指数增长,对CPU压力较大,建议将混合的音源个数控制在4个以内,基本上可以满足绝大多数的移动游戏了
  • CRIWARE
    • 经常用到的处理视频的解决方案库
    • 这是一个更恐怖的库,默认带CAk开头的线程都是它开启的,并且每个线程的开销都很高,而且一直很高,视频播放完负载也不会降低。一般情况下,同时只开启一个视频时,可能感受还好
  • 总结
    • 功耗和发热问题,不仅仅需要对游戏本身做常规优化,还要关注这些三方SDK,使用时,不要用无脑的默认设置进行集成,一定要看看有没有提供优化的设置或接口,否则这些三方库和SDK也会成为一个个耗电发热的小能手,最好分别做裸包与平台包的耗电量与发热测试