Unity移动端游戏性能优化简谱之 功耗、发热和降频在软件层面的优化

Unity移动端游戏性能优化简谱之 功耗、发热和降频在软件层面的优化

《Unity移动端游戏性能优化简谱》共分为五个部分,今天向大家介绍文章的最后一部分:功耗、发热和降频在软件层面的优化,包含了移动端高功耗与发热产生机制、功耗与发热的定量数据分析、使用Perfetto的功耗调优实践等多项常见的游戏画面表现讲解。(全文长约3200字,预计阅读时间约15分钟)

前四部分可点击以下对应文章查看:

一、《Unity移动端游戏性能优化简谱之 前言》
二、《Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存(上)》
《Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存(下)》
三、《Unity移动端游戏性能优化简谱之 以模块思维划分的CPU耗时调优(上)》
《Unity移动端游戏性能优化简谱之 以模块思维划分的CPU耗时调优(下)》
四、《Unity移动端游戏性能优化简谱之 达到GPU压力与画面表现间的平衡》

1. 功耗、发热与降频基本原理

1.1 移动端高功耗与发热产生机制
手游运行时功耗由核心计算功耗(CPU/GPU/NPU)、访存功耗、外设功耗(屏幕/射频/传感器/存储)、系统调度开销四部分构成,其中对于手游来说尤其常见和需要关注的情况有:
高负载场景下(战斗、大世界渲染、物理模拟、网络同步),CPU/GPU持续高频运行,功耗可能持续过高;
手机机身散热面积有限,热量无法快速传导至外部,形成热堆积,且往往出现部分硬件模块压力尤其大,发热严重并传导到附近其他模块,使得这些模块也出现性能问题;
功耗与性能并非线性关系,超过能效拐点后,性能小幅提升会带来功耗大幅上涨,发热急剧恶化。

当SoC温度达到温控阈值,Android内核与固件会启动多级热防护机制,强制降低性能以控制发热,多数情况下体现为CPU/GPU频率降低、限制大核调度、减少并发线程数。

降频同时导致了CPU/GPU的算力下降,常直接导致游戏运行过程中帧率暴跌。尤其相对于其他前文讨论的性能问题,该问题反而在一些玩家的高端设备上更加显著,对于一些算力强劲的CPU/GPU,可能计算压力并不足以直接导致掉帧,但发热降频却导致了这些玩家有手机发烫、低帧卡顿等负面体验。

1.2 功耗与发热的定量数据分析
作为开发者和性能优化执行者,观察问题的视角显然还是要与玩家区分。因此,要精准定位功耗与发热的核心诱因,应避免依赖 “手感发烫”、“续航缩短”等主观感受,必须通过定量数据分析建立客观判断标准。正如上文讨论的,移动端游戏的功耗发热本质是硬件模块(CPU/GPU/存储/射频等)持续高负载运行的结果。所以定量分析的核心目标是:明确各硬件模块的功耗占比、定位高功耗场景的时间分布。

不过定量分析功耗发热问题的核心困难是,该问题其实已经脱离了游戏引擎可掌控的范畴,属于非常硬件层的问题。这就导致了不同芯片厂商、不同SoC厂商、不同手机厂商,其散热设计、保护机制等因素的不同都会导致发热和降频的情况互不相同;且他们提供的数据采集接口即便看起来单位一致,其实表示的实际开销也互不相同;在测试过程中,也会受到环境的干扰,比如冬夏气温、插电测试都会导致测试结果受到影响。

所以,应当尽量在固定设备使用可靠的工具进行测试,将数据进行按时间的、优化调试前后的纵向测试,而不是不同硬件、不同工具之间的横向测试。

1.3 使用Perfetto的功耗调优实践
1.3.1 市面上功耗测试工具评测
功耗优化的第一步是精准采集数据,市面上各类功耗测试工具各有优劣,需结合实际测试需求、设备适配性择优选用,以下是主流工具的实操测评与选型建议:

(1)GOT Online作为常用性能监测工具,可实时采集帧率、帧耗时、CPU核心频率、内存占用、功耗峰值等核心数据,支持设备截屏、数据导出与对比分析,能直观呈现游戏运行时的功耗波动,基础监测能力在线,但针对细分硬件功耗的拆解能力有限。

(2)Trepn Profiler实测实用性较低,数据采集精度与稳定性难以满足专业调优需求;adb shell dumpsys batterystats指令虽能获取电池消耗数据,但数据维度单一、参考价值不大,仅能作为辅助参考,无法支撑深度功耗分析。

(3)Android Studio自带的Profiler工具,搭载On Device Power Rails Monitor(ODPM)模块,可监测CPU大小核、GPU、内存、屏幕、WiFi等硬件组件的功耗,但缺陷十分突出:不仅需要Debuggable包体,还仅适配Pixel系列机型,且测试时长不宜过长,通用性极差,难以适配主流安卓机型的规模化测试。

(4)Perfetto是移动端功耗测试的最优选择之一,无需Debuggable包体,支持USB/WebSocket连接实时录制。只不过在采集各硬件功耗轨道数据时,谷歌官方只在自己旗下的Pixel品牌手机中进行了专门的插桩,从而能够清晰呈现power.rails.cpu.big、power.rails.gpu、power.rails.memory.interface等细分模块的能耗值,还能通过ui.perfetto.dev在线分析Trace文件,精准定位功耗峰值与异常节点,是下文介绍的调优实践的核心工具。

移动端Unity游戏的能耗分布并非无迹可寻,核心能耗集中在CPU、GPU、内存、屏幕、网络和SoC等硬件模块,各模块的运行状态直接决定整机功耗。开展功耗测试前,需统一测试标准:固定30FPS帧率、固定屏幕亮度与刷新率,排除外界因素干扰;采用AB Test对比优化前后数据,依托Perfetto采集硬件细分功耗,搭配GOT Online排查CPU耗时、Gears监测GPU Counters,必要时用Renderdoc、Xcode截帧分析渲染细节,全方位定位问题。

结合实测数据逐一拆解如下。

1.3.2 GPU质与带宽对功耗的影响

测试数据如上图。GPU是游戏功耗的核心来源之一,其能耗与画质等级、数据带宽强相关,画质档位越高,GPU时钟频率、带宽占用越高,整机功耗随之陡增。实测数据显示,从省电、流畅、标准到精致画质,GPU带宽从1195MB/s升至1483MB/s,ddr.c、memory.interface、gpu.l2都有不同程度的上升;GPU Clocks从264M/s升至393M/s,GPU功耗从335mW攀升至543mW;整机功耗涨幅超270mW,GPU压力与能耗呈正相关。

带宽是GPU能耗的关键影响因子,半透明叠加层数、纹理格式与Mipmap开启状态,对带宽和功耗的影响尤为显著。对比测试发现,同等层数下,开启ASTC 4x4纹理压缩可降低带宽与功耗,而开启Mipmap的优化效果远优于纹理压缩:30层纹理开启Mipmap后,带宽从3.38GB降至0.9GB,GPU功耗直降49mW;50层纹理开启Mipmap,功耗降幅超160mW。据此可得出核心结论:3D渲染纹理务必开启Mipmap。

且带宽与能耗存在固定估算关系——1GB/s≈67mW,带宽越高,内存交互、GPU缓存的功耗损耗越大。

综上,建议所有3D场景纹理开启Mipmap,优先选用ASTC 4x4、ETC2等移动端压缩纹理,摒弃无压缩格式;根据机型性能划分画质档位,低端机锁定省电/流畅档位,降低GPU时钟频率与带宽占用;减少半透明叠加层数,规避无效渲染拉高带宽。从而最终降低GPU带宽。

1.3.3 屏幕和网络对功耗的影响
亮度:

刷新率:

画面内容(色彩鲜艳程度):

测试数据如上图。屏幕能耗受三大因素主导:刷新率、亮度和画面色彩复杂度。实测数据表明,亮度与画面内容相同时,90帧刷新率的屏幕功耗高于60帧;刷新率与画面内容固定时,屏幕亮度越高,功耗越大;而刷新率和亮度不变,则彩色画面的屏幕功耗远高于纯黑画面——100%亮度下,彩色壁纸屏幕功耗达575mW,纯黑壁纸仅140mW,差距超4倍。开发者可通过动态调节亮度、适配机型刷新率和简化冗余画面色彩,实现屏幕功耗压降。

测试数据如上图。网络传输是隐性功耗增长点,10MB/s下载速率下,WiFi与移动数据的功耗差异显著,且均会大幅拉高整机功耗。无下载状态下,WiFi模组功耗仅62mW,开启下载后飙升至359mW;移动数据模组则体现在modem模块从280mW飙升至583mW功耗,加上CPU线程的开销整机总功耗涨幅超500mW。

综上,根据场景动态调节屏幕亮度,非核心场景降低屏幕刷新率,简化复杂彩色画面;网络端优化资源下载逻辑,避免大体积资源后台高频下载,线上游戏精简网络传输数据量、尽量减少持续性传输的做法,降低模组功耗。

1.3.4 CPU对功耗的影响

CPU功耗遵循动态功耗公式:P_dynamic ∝ C * V² * f,功耗与工作频率并非线性关系,核心频率越高,功耗呈指数级增长。主线程密集运算的功耗远高于多线程分摊,实测主线程运算功耗达3.67W,大核频率2.58GHz;改用JobSystem多线程后,总功耗降至2.55W,大核频率压至1.4GHz,优化效果显著。

此外,子线程运算对CPU功耗也是不可忽视的因素,但在引擎层缺乏可靠的手段予以分析。这里介绍一个使用SimplePerf工具采集并分析子线程的流程。只要用Release模式打包,搭配Create Symbols生成符号文件,便于SimplePerf工具解析函数调用栈,即可精准定位子线程高耗函数;获得的测试结果如上图。观察到该项目运行过程中存在一个占比极高的逻辑线程,超过了渲染线程甚至直逼主线程,这是非常异常的现象,点开观察细节后从该线程的函数名分析得到该线程为专门处理网络的线程。

如图测试,优化前CPU功耗高达4820mW,定位并清理冗余运算后,功耗降至3838mW,压降近千毫瓦。

综上,建议拆解主线程密集运算,将物理计算、动画更新等任务迁移至JobSystem,利用多线程分摊负载,避免CPU大核高频运行;通过SimplePerf定位子线程高耗函数,清理空转循环、冗余遍历等无效逻辑;严格采用Release模式打包,关闭调试相关冗余配置,减少CPU额外开销。


2. 结束语

这篇文章之所以称为简谱,实在是因为这些笔墨远不能达到面面俱到,很多内容还未涉及到,或者限于篇幅和重点不能深入讨论。它更多的是立足于如何以用好一套完善完整的性能工具为基础,构建发现问题-解决问题-监控问题的优化思维和优化体系,使得性能优化的工作事半而功倍。更多的优秀内容,欢迎在UWA社区中进行搜索。


至此《Unity移动端游戏性能优化简谱》已经全部更新完毕,文章从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能检测工具确定和解决这些问题。内容包括了性能优化的基本逻辑、UWA性能检测工具和常见性能问题,希望能提供给Unity开发者更多高效的研发方法和实战经验。