Unity手机游戏发热发烫优化指南与技巧
很多小伙伴做完游戏后,发布到Android,运行,游戏很流畅,也不卡顿,但是跑一会游戏,手机就发热,发烫。客户提出需求,能否让它不发烫? 本文从以下3方面来分析手机发烫的问题,给大家提供一个解决此类问题的通用思路:
对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习unity的零基础小白,也有一些正在从事unity开发的技术大佬,欢迎你来交流学习。
1手机发烫是如何引起的?为什么要解决发烫问题?
手机可以理解为是一台小型的电脑, 里面运行了很多app。CPU处理完数据和事件后,如果没有任务要处理了,就会休眠下去, CPU占用率也就会下降。休眠下去了,CPU不工作或工作在低功耗模式下了,消耗的电流就没有那么大了。手机电路也会有电阻,电阻+电流就会转化为热能(热能=I*R^2),热能会通过手机的散热导热系统从外壳散去。长时间CPU的工作,就会导致长时间的高负荷电流,从而导致产生大量的热能,如果热能的产生速率大于热能散发的速率,手机表面温度就会升高,也就是我们说的发烫。
“手机发烫”的本质是CPU”很努力不休息”的工作才能保证游戏app的流畅运行,达到额定的帧率。而这个过程中产生热量的速度大于散去热量的速度。所以手机发烫的本质还是CPU处理的事情较多,本质还是要提升程序的性能,让程序能更快的完成从而让CPU有机会休眠或低功耗运行,从而让手机不发烫,所以解决手机发烫的本质问题还是优化提升手机游戏app的代码性能。
2 如何定位手机发烫的问题
经过上面的分析,虽然游戏不卡,但是CPU长时间满负荷的工作导致手机发烫,问题本质还是性能优化问题。所以本质还是性能优化的问题。定位手机发烫问题和定位性能问题大体思路与处理方式一样的。接下来我给大家分析几个常用的定位问题的方式和方法。
(2) 手机游戏开发的时候往往会根据游戏的”视觉品质”来进行配置,分为最高等的画质与特效效果,中等画质与特效效果,低端画质与特效效果。我们首先要将用户的机器进行分类,分成高中低三个档次,每个档次的机型我们适配匹配好对应的效果和特效。比如,高端机上跑高质量,中端机跑中质量,低端机跑低质量。当我们接收到用户反馈的手机发烫的时候,首先要根据手机来判断属于哪一档,来进行处理。比如低档机跑高质量的画质肯定会产生卡顿与发烫,这个时候我们要把对应的画面质量与对应的性能做到匹配,做到每个档次的机器在对等的画质上能做到不发热。不要出现机器与画质不匹配与对等的情况。如果出现发烫,我们要统计出来是那个档次画面的哪种机型。比如中画面质量在中档手机上发烫。有时候我们一个档次的画面来适配全部的高中低端机,那么这个时候可以考虑将画面参数进行调节来适配。
(3) 如果同一个档次画面质量在同一档的机型上发热,那么就是性能优化的问题了。我们能做的就是提升程序的性能,让CPU有更多的休眠时间,从而解决发热。做性能优化定位问题的时候我们要确定好是哪个部分占用的CPU+GPU资源导致发热。一个一个模块的排查: 渲染模块,物理引擎模块,逻辑算法模块,其它,排查的时候,我们一般会一个一个的内容重建,比如,排查渲染模块,我们可以只做渲染,做同等规模的游戏地图与渲染单元,查看运行结果,分析CPU占用率,看是否引起发烫。物理引擎模块可以通过增加和减少物理计算单元来定位是否为物理引擎的问题。隔离掉逻辑算法代码,看CPU占用率是否有改善。如此根据自己的游戏逻辑逐步定位性能热点。
(4) 在游戏开发项目中,越早进行机器的性能测试,是否发热等指标,能帮助我们快速的定位是加入了哪些功能导致了机器发热,同时测试机器最好都准备几个有代表性高中低端手机。一般我们做项目的时候,每个礼拜都会完整的真机测试有代表性的机器。
(5) 超规模的资源占用,导致OS操作系统的系统进程CPU占用率飙升。比如系统的内存时1G,你游戏的内存占用了2G,这样可能会导致操作系统不断的与磁盘swap进行数据交换释放物理内存来满足内存访问,从而导致系统负担过重,系统进程服务的CPU占用率飙升,导致手机发烫。
3 针对性常用优化手段与策略?
接下来给大家列举一些针对性的优化方向供大家参考和指导,每一项优化都有很多资料,具体的操作大家可以查找相关的资料,或者查阅我们往期相关的优化技巧。
(1) 做好高中低端机型的适配, 高端手机上高端效果,低端手机上低端效果,比如高端手机正常,低端手机发烫,可以针对低端机考虑关闭光照计算,关闭阴影计算,切换一些更简单的shader, 关闭一些特效。 指定一些规则,然后游戏运行后自动判定分类手机的类型,来开关相关的参数。
(3) 渲染常用的优化手段: 优化渲染规模,使用增强细节的手段来代替模型面数,提升shader性能。空间换时间来提前预制烘培,合并drawcall, 减少set pass call,优化动画组件将顶点动画烘培到纹理中。等等。
(4) 物理引擎的常用优化手段: 修改物理引擎迭代计算的参数,降低刚体迭代的数目,使用更高效的方式替代物理引擎。等等。
(5) 优化数据结构内存占用与算法: 缓存池减少节点反复大规模的删除与创建,优化算法,降低算法复杂度,空间换时间(预先计算好结果存储起来,运行时查表即可),时间换空间,多线程优化等。可以把部分的计算放到GPU中。等等。
定位好问题,认真分析后针对性的来解决对应的点就可以了。我们大部分的同学不会做性能调优主要是问题定位没有思路,定位不准确,技术手段不熟练,从而导致了找不到问题,找到了问题不知道下什么手段。进入小组可以获得更多性能调优的文章与课程。