技术分享连载(四十九)

技术分享连载(四十九)

本期话题:快速定位UI元素的重建、Mipmap数量怎么计算、Resources.UnloadAsset()用法...精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UWA 问答社区:answer.uwa4d.com
UWA QQ群:793972859


资源管理

Q1:常用资源类型网格、材质、贴图、动画都是引用或复制+引用的方式被使用,对于那些被引用的资源,需要等引用者不再引用了才能使用Resources.UnloadAsset吗?常用的资源几乎都是引用或引用+复制的关系,所以我对这个接口的理解是用处不大,请问大家是如何使用Resources.UnloadAsset这个接口呢?
请输入图片描述

是的,一般来说,Resources.UnloadAsset比较适合于在场景中动态释放一些不常使用的资源(比如特殊剧情的资源、音频等等),而对于频繁使用或者需要常驻内存的资源则不适用。使用Resources.UnloadAsset的好处是降低场景切换时的Resources.UnloadUnusedAssets的计算压力,减少不必要的UnusedAssets的查找和检测耗时。


UI

Q2:请问UWA有什么办法可以快速定位到NGUI中是哪一个Panel在LateUpdate中触发了重建操作吗?

目前,UWA在线报告中并没有功能可以快速并且精准定位NGUI中到底是哪个Panel在触发UIMesh的重建。对于该类问题,我们均是进驻到开发团队中,通过在Editor中不断查看和测试项目的具体UI制作来定位这个问题。这本身是一个相当繁琐的问题,在我们优化了许多项目之后,我们将其困难之处归为以下三点:

  1. UIMesh重建的诱因多样化。Widget移动、Atlas穿插、Active/Deactive状态切换、Alpha变为0等等,这些情况均可能引起UIMesh的重建;

  2. UIMesh重建的类型多样化。不少情况重建是可以在渲染画面中看到的,但仍有大量情况,其Widget是在视域体外部的(比如不再使用且被缓存了的HUD、没有显示但也没有Deactive的任务、背包面板等);

  3. 大量团队都在使用NGUI,但绝大多数开发人员对NGUI的重建机制并不透彻掌握。因此,我们在发现其重建问题后,还要详细解释其原因,才能防止研发团队后续研发过程中再犯此类问题。

上述文字并不是对该问题的直接回答,而是我们关于NGUI UIMesh重建问题的思考。如果你的项目也被UIMesh重建问题所困扰,希望上述几点可以对你有所启发。


资源管理

Q3:我的游戏运行一段时间之后,已经切换到一个空场景了,然后手动调用了System.GC.Collect(); Resources.UnloadUnusedAssets();为什么还是会有这么多贴图资源被引用呢。我猜可能是由于一些脚本中的静态变量引用导致,请问有办法查出来是哪些静态变量吗?

很大可能是这些资源直接或间接被其他Container缓存了,这种情况在我们进行内存泄露分析时经常遇到。如果是Unity 5.3以后版本,建议尝试在iOS版本上在Memory Profiler中进行查看具体的引用信息。


资源管理

Q4:在UWA性能测评报告中,为什么同样分辨率、同样格式的纹理资源,其内存相差一倍?表格中Mipmap的数量是怎么计算的?
请输入图片描述

一般来说,在开启Mipmap的情况下1024x1024的ETC2纹理应该是1.3MB的,但YYS_02_buildling002_2为2.7MB,所以很有可能是开启了Read/Write选项,建议在Editor中查看该纹理的具体设置。

Mipmap的数值表示该纹理Mipmap的层数,其与纹理的分辨率相关,具体建议阅读:https://en.wikipedia.org/wiki/Mipmap


动画

Q5:请教大神们个问题,美术在制作人物模型的骨骼动画时候,一般是没有必要缩放的,但是导出的动画文件里还有这部分信息。不知道是否有优化掉的必要。如果有,有什么好方法么?
请输入图片描述

如果可以,还是建议尽可能去掉这部分“无用”信息。研发团队可根据这里的方法来进行批量处理。
http://answers.unity3d.com/questions/668672/removing-scale-curves-from-animation.html

今天的分享就到这里。也欢迎热爱进步的你加入UWA的QQ群(793972859),也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。 比起闭门造车,我们更乐意与大家各抒己见,畅所欲言;比起形而上的泛泛而谈,我们更乐意与大家直击痛点,对症下药。