使用UWA GOT优化Unity性能和内存

简介:

使用UWA测试平台作为性能分析的辅助手段已经有很长时间了,每个版本测试一下可以得到一份整理过的报告,比人工分析高效不少。但毕竟网站提交的方式需要等一段时间。这次得知UWA还出了本地化的工具,立马尝试了一下,果然非常给力。

UWA GOT有三种分析方式CPU Overview,Mono Analysis和Assets Tracker,我最喜欢的是Mono Analysis,查找内存泄漏问题时就方便很多。虽然分析上不如XCode全面详细,但已经满足日常的基本需求,一些测试工作也可以交由测试同学完成,离线分析。

UWA GOT的使用方式就不多说了,官方的帮助文档非常详细,这里提供下传送门。

以下是性能分析工具的截图:
请输入图片描述

CPU Overview模式可以检测出高耗时的逻辑函数。在下图中,我们可以看到逻辑层的开销比较高,考虑到是帧同步,所有逻辑都在逻辑层,66ms更新一次,开销比较高的模块在角色,技能,网络等。由于在此之前,已经优化过几轮,各个模块的开销都比较平均了,没有明显的瓶颈,进一步的优化需要更细致的深度分析和优化了,属于打磨的过程。
请输入图片描述

Asset Tracker模式可以追踪到各个资源的使用情况,包括具体资源的格式是否合理,是否存在冗余等问题。下图可以看到AI的内存开销比较高。主要是因为AI对一些帧操作做了Clone。
请输入图片描述

下图是日志和录像的系统开销,可以看到其耗时较高。不过录像系统只有Debug在客户端,Release版会记录在服务器,日志系统只有Debug版会记录本地,Release版只会上报不同步的、前后有限帧的数据,并且日志系统也将会改成记录二进制数据。
请输入图片描述

下图是利用Asset Tracker功能发现的冗余MeshCollider,我们项目目前只使用了BoxCollider和基本的射线检测,在此基础上实现了一套简单的物理系统。因此是不应该有MeshCollider的使用,此处初判是误传的资源。
请输入图片描述

特效和场景资源占用较高,还需要美术进一步优化。战斗激烈的时候特效占的内存甚至要比贴图和Mesh加起来还大。
请输入图片描述

特效部分主要是粒子系统,使用次数非常多,产生的内存占用也相当高,超过了贴图的大小。这是因为射击游戏时,每帧会产生大量子弹,更需要小心使用和优化。
请输入图片描述

场景的Mesh资源合并后,内存占用也比较高,因为场景一直无法确定,美术不能做人工静态合并,只能做载入时的静态合并,等场景确定下来可进行人工或借助插件合并。
请输入图片描述

FMOD的参数使用了String,并且调用次数非常高,导致GC较高,可以优化。
请输入图片描述

下图是技能系统底层,我写的计时器使用了delegate,并且次数非常高,从而也导致了GC较高。因为整个游戏中,几乎所有的变现效果都使用这套系统,所以这块是目前最大的瓶颈。
请输入图片描述

作为一个射击游戏,子弹数据非常高,虽然使用了内存池,也做了预加载并制定了一次策略,但是不同技能表现出脚本调用的频率差距很大,个别脚本预加载的个数远远不够。
请输入图片描述

UI的一些合并产生了较高的GC,可以划分动态和静态层,也可以对动态需要隐藏的UI使用移除屏幕等方式减少合并次数。
请输入图片描述

下图为一些粒子系统播放开关产生的开销。
请输入图片描述

跳字GC较高,因为使用了渐变,这部分可以做优化。
请输入图片描述

UWA GOT中的Mono Analysis可以对比两帧的内存快照,从而找到增量的部分。下图是实测图,对比两帧之间,可以发现还有一点创建角色的GC开销,看起来不高,我推测有角色漏了预加载,因为技能可能召唤角色,各种生成器会随机产生道具和怪物等,都有可能漏掉。此外开始帧和结束帧之间内存分配差异较小,说明优化得较好。
请输入图片描述

利用好UWA GOT的这三个功能后,到这里基本上已经能抓出不少性能的瓶颈了,接下来我们也能大致拟定一个优化的方案了。需要说明的是,因为之前也定期使用UWA的线上检测工具,感觉线上检测工具虽然耗时较长(可能要一天),但是分析的功能和深度还是更胜一筹,当然UWA GOT的优势重在灵活和高效,所以建议大家结合起来用。


文末,感谢韩宇飞的分享,小编有幸也体验了他们的游戏,是一款俯视角英雄枪战手游,同时融合了MOBA的属性,创造性地将操作感与策略性,游戏创造性地将职业以及英雄技能加入到了传统射击游戏中,欢迎大家戳此传送门来了解哦!https://www.taptap.com/app/14617
QQ20170922-191011.png







原文出处:侑虎科技
本文作者:admin
转载请与作者联系,同时请务必标明文章原始出处和原文链接及本声明。

目录
相关文章
|
2月前
|
存储 缓存 安全
C语言中的内存管理与优化技巧
C语言中的内存管理与优化技巧
39 0
|
8天前
|
存储 开发者 Python
优化Python代码中的内存占用:实用技巧与最佳实践
本文将介绍如何优化Python代码中的内存占用,通过实用技巧和最佳实践,有效减少内存消耗,提升代码性能和可扩展性。
|
1月前
|
缓存 算法 Java
Java内存管理:优化性能和避免内存泄漏的关键技巧
综上所述,通过合适的数据结构选择、资源释放、对象复用、引用管理等技巧,可以优化Java程序的性能并避免内存泄漏问题。
28 5
|
2月前
|
存储 设计模式 缓存
C++享元模式探索:轻松优化内存使用和性能提升之道
C++享元模式探索:轻松优化内存使用和性能提升之道
41 0
|
2月前
|
存储 缓存 算法
深入探究LRU缓存机制:优化内存利用与提升性能
深入探究LRU缓存机制:优化内存利用与提升性能
165 1
|
2月前
|
缓存 资源调度 Go
内存模型与调度器在Go语言并发编程中的应用与优化
【2月更文挑战第16天】Go语言以其独特的并发编程模型而备受瞩目,其中内存模型和调度器是支撑其高效并发执行的关键机制。本文将探讨内存模型与调度器在Go语言并发编程中的应用场景,并介绍一些优化策略,帮助开发者更好地利用这些机制,提升程序的性能和稳定性。
|
8天前
|
存储
浮点数在内存中的存储
浮点数在内存中的存储
18 0
|
8天前
|
存储
数据在内存中的存储之整数存储
数据在内存中的存储之整数存储
16 0
|
2月前
|
存储 C语言
C语言第二十九弹---浮点数在内存中的存储
C语言第二十九弹---浮点数在内存中的存储
|
8天前
|
存储 算法
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
【三种方法】求一个整数存储在内存中二进制中的1的个数附两道课外练习题
7 0