Unity性能优化与分析–总览

1 性能分析工具

1.1 Unity Profiler

Unity引擎自带的 Unity Profiler可帮助检测运行时出现任何延迟或冻结的原因,或帮助了解特定帧(时间点)发生了什么。默认启用 CPU 和内存跟踪。如果对游戏有特定需求(例如,大量使用物理系统或基于音乐的游戏玩法),可以监控其他性能分析器模块,如渲染器、音频、物理系统等。

在打包Build Settings界面通过选中 Development BuildAutoconnect Profiler 来针对设备构建应用程序,或手动连接以加快应用程序启动速度。

这是一种基于 instrumentation 的性能分析器,它分析显式包装在ProfileMarkers 中的代码时序(例如 Monobehaviour 的 Start 或 Update 方法,或特定的 API 调用)。此外,当使用深度性能分析设置时,Unity 可以分析脚本代码中每个函数调用的开始和结束,以准确告诉您应用程序的哪一部分导致运行速度变慢(但这会带来额外的性能开销)。

在对游戏进行性能分析时,我们建议您涵盖游戏的尖峰和平均帧开销。了解和优化每一帧执行的高开销操作,对运行帧率低于目标帧率的应用程序更有用。在寻找尖峰时,首先探索高开销操作(例如,物理系统、AI、动画)和垃圾收集。

在窗口中单击来分析特定帧。然后,使用 TimelineHierarchy 视图 :

  • Hierarchy 显示分组到一起的 ProfileMarkers 的层次结构。这让您可以基于时间成本(以毫秒为单位,Time msSelf ms)对样本进行排序。您还可以计算该帧中函数的调用次数和托管堆内存 (GC Alloc)。

  • Timeline 显示特定帧时间的可视化明细。这让您可以直观了解活动之间以及跨不同线程的关系。使用它可以确定应用程序受 CPU 限制还是受 GPU 限制。

Hierarchy 视图可按时间成本对 ProfileMarkers 进行排序。

有关 Unity Profiler 的完整概述,请单击此处。对于刚刚接触性能分析的人士,也可以观看 Unity 性能分析简介

在优化项目中的任何内容之前,请先保存 Profiler .data 文件。然后实施更改,并比较修改前后保存的 .data。按照“分析、优化和比较”的方式来提高性能。反复进行这一过程。

1.2 Unity Profile Analyzer

通过该工具,可以聚合多个 Profiler 数据帧,然后找到感兴趣的帧。想在对项目做出更改后查看 Profiler 有何变化? Compare 视图允许您加载和比较两个数据集,这对于测试更改结果是否有所改进至关重要。可通过 Unity Package Manager 获取 Profile Analyzer

1.3 Unity Frame Debugger

用于进行Batch分析

1.4 Memory Profiler

这个独立的附加组件(在 Package Manager 中作为实验性包或预览包提供)可以拍摄托管堆内存的快照,帮助发现碎片、内存泄漏等问题。


在 Tree Map 视图中单击,可跟踪持有内存的原生对象的变量。在这里,可以识别常见的内存使用问题,例如纹理过大或资源重复。


观看如何使用 Unity 中的内存性能分析器来改善内存使用量。还可以查看官方的内存性能分析器文档。


1.5 Unity UPR

Unity官方基于Profiler升级的性能分析工具, 免费, 推荐长期使用!!

1.6 UWA

一款主流的第三方性能分析工具, 收费较贵, 但可以免费试用

支持真人真机测试

支持专家远程协助

分析报告更详细

支持本地资源检测

支持AB包检测

提供了方便开发者在逻辑代码中进行打点的API&UWA GOT Online,从而将复杂的函数拆解开,在报告中排查堆栈耗时、更快速地验证优化效果。

1.7 在 iOS 上,可以使用 XcodeInstruments
1.8 在 Android 上,可以使用 Android StudioAndroid Profiler

2 真机性能分析常识

满足每帧的特定时间预算要求

根据每秒目标帧数 (fps),每一帧都有时间预算。理想情况下,以 30 fps 运行的应用程序允许每帧用时约 33.33 ms (1000 ms/30 fps)。如果目标为 60 fps,则每帧用时上限为 16.66 ms。

但是,对于移动设备,不能始终使用这么长时间,否则设备会过热,操作系统会对 CPU 和 GPU 进行热节流。我们建议只使用约 65% 的可用时间,以便在帧之间留出冷却时间。目标为 30 fps 时,典型的帧预算为每帧约 22 ms,60 fps 时为 11 ms 左右。

设备可以在短时间内超出该标准(例如,过场动画或加载序列),但不能长时间超标。

确定应用程序受GPU 限制 (GPU-bound) 还是受 CPU 限制 (CPU-bound)

Profiler 可以告诉您 :罪魁祸首是 CPU 耗时超出了分配的帧预算,还是在于 GPU。

如果看到 Gfx.WaitForCommands 标记,说明渲染线程已准备就绪,但可能正在等待主线程上的某个瓶颈。

如果经常遇到 Gfx.WaitForPresent,说明主线程已准备就绪,但正在等待 GPU 渲染帧。

使用 Timeline 视图确定应用程序受 CPU 限制还是受 GPU 限制。

考虑设备温度

大多数移动设备不像台式机那样具有主动冷却功能。物理热量水平会直接影响性能。

如果设备运行得很热,即使没有导致问题,Profiler 也可能报告性能不佳。请在短时间内进行性能分析,以保持设备凉爽和模拟真实世界的情况,从而应对性能分析产生的开销。

在最低规格设备上进行测试

市面上有各种各样的 iOS 和 Android 设备。请在希望应用程序支持的最低规格的设备上测试项目。

及早并经常进行性能分析

Unity Profiler 可提供关于应用程序的性能信息,但如果您不使用它,它也帮不了您。请在开发早期对项目进行性能分析,而不仅仅是在即将发布时。一旦出现问题或尖峰,立即展开调查。为项目开发一个“性能签名 (performance signature)”,将能够更轻松地发现新问题。

不要盲目优化

不要猜测或假设是什么拖累了游戏性能。使用 Unity Profiler 和特定平台的工具找出导致延迟的具体原因。

此外,并非本指南中介绍的所有优化都适用于您的应用程序。在别的项目中具有良好效果的措施可能对您的项目不起作用。找出真正的瓶颈,然后集中精力解决问题。

3 性能分级

在游戏立项初期的时候, 我们需要为每一个项目定制一套设备分级策略, 并为每个分级制定性能目标

根据项目类型和需求不同, 分级策略也会不同

这里假设当前项目为FPS中重度游戏, 有较高性能消耗, 目标帧率为60帧

3.1 最高配置要求 骁龙8Gen3, 内存12G以上(如3500元的红米手机)

同屏面数不超过60W(注意是同屏而不是同场景)

Reserved Total内存不超过4GB

Mono堆内存不超过80M

Lua内存不超过100M

3.2 推荐配置要求 骁龙8Gen1+, 内存8G以上(如2500元的红米手机)

同屏面数不超过45W(注意是同屏而不是同场景)

Reserved Total内存不超过2.7GB

Mono堆内存不超过80M

Lua内存不超过100M

3.3 最低配置要求 骁龙870, 内存6G以上(如1500元的红米手机)

同屏面数不超过35W(注意是同屏而不是同场景)

Reserved Total内存不超过2GB

Mono堆内存不超过80M

Lua内存不超过100M

 参考文献:

Unity移动端游戏性能优化简谱_UWA学堂

《Unity性能优化》系列课程 | Unity 中文课堂

移动游戏优化指南 | Unity 中文课堂

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>