技术分享连载(三十)

技术分享连载(三十)

本期话题:为什么切换场景都会有UIPanel.LateUpdate()这个函数的堆内存开销、切换场景DrawCall过高是为什么...精选5个资源优化问题,建议阅读时间10分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


资源管理

Q1:我想请教一下,下图这个函数中,每次我都申请了一个List temp = list();在这里存放6KB的数据,但是如果不做GC处理,这6KB是否就一直累加,直到做GC处理了才会释放掉,是这样么?如果调用次数很多,每次都调用一点点,也会推高内存占用吗?
0.png

A:是的,这个6KB堆内存会随着Update的执行一直分配内存,所累积的堆内存会在GC触发时进行销毁。一般来说,研发团队需要尽可能避免在高频次调用函数中进行堆内存的分配。


资源管理

Q2:我的UWA报告中看到几乎每次切换场景都会有UIPanel.LateUpdate()这个函数的堆内存开销,请问说明了什么问题,我是否还能优化?
请输入图片描述

UIPanel.LateUpdate持续分配较大量的堆内存,说明UI界面在制作上存在以下问题:

  1. Panel中Widgets数量过多,且存在频繁的变动,导致UIPanel需要进行大量的网格重建;
  2. 动静态UI元素没有分离。

建议研发团队对UI界面的制作进行进一步检测,尽可能将静态UI元素和动态UI元素分开,存放于不同的Panel下。同时,对于不同频率的动态元素也建议存放于不同的Panel中。


资源管理

Q3:我UWA报告中“渲染模块”界面中看到大部分场景中的三角面片数是正常的,但在某一帧时DrawCall、Traingle、蒙皮网格数骤然提升,请问这可能是什么原因导致的?这三个参数的变化曲线是否有规律?为什么我在切换场景的时候也会有400多的DrawCall呢?
请输入图片描述

从图中看,这种情况发生在场景切换处。这种情况的发生原因很可能为一次性动态加载大量GameObejct,然后再手动Deactive当前并不需要使用的GameObject。研发团队可以查看该峰值处的场景名称和相关截图,从而来进一步定位发生该问题的根本原因。


开发技巧

Q4:我移动一个物体从A点到B点,当到达B点后执行另一个事件。我现在是每帧计算物体到B点的距离,当距离小于某个值后算是到达,感觉有点浪费。有没有什么推荐的办法呢?

如果每帧只进行一次距离上的判断计算,那么该耗时开销本身是很小的。当然,开发团队可以在B点放置一个Trigger,当A进入Trigger后,通过其回调函数来进行物体的后续操作。


资源管理

Q5:关于贴图类型设置请问有什么好的建议呢?是否所有的贴图都设置为Advanced比较好?这种情况下的贴图内存是不是比较小?
请输入图片描述

Unity默认情况下会将绝大多数纹理设置为Texture模式。一般来说,Texture模式对于绝大多数纹理资源也都是合适的。上面的例子中,Advanced模式下之所以内存占用较小,是因为关闭了Mipmap选项,所以其内存下降了。其本质跟Advanced模式无关。Advanced模式较之Texture模式和其他模式,可以更大自由地对纹理资源进行控制。因此,如果你想对纹理资源进行更加自定义地设置,可以选择Advanced模式进行编辑。