技术分享连载(三十六)

技术分享连载(三十六)

本期话题:EvenSystem.Update()、UI网格重建、Mesh动态合批、资源冗余...精选5个性能优化问题,建议阅读时间15分钟,认真读完必有收获。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。

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


资源管理

Q1:我在UGUI里更改了Image的Color属性,那么Canvas是否会重建?我只想借用它的Color做Animation里的变化量。

如果修改的是Image组件上的Color属性,其原理是修改顶点色,因此是会引起网格的Rebuild的(即Canvas.BuildBatch操作,同时也会有Canvas.SendWillRenderCanvases的开销)。而通过修改顶点色来实现UI元素变色的好处在于,修改顶点色可以保证其材质不变,因此不会产生额外的Draw Call。


资源管理

Q2:AssetBundle中资源同名但实际不同,请问会在UWA的资源检测报告中被认为是冗余的吗?

项目中的同名资源在UWA的资源检测报告中是不会被认为冗余的。在资源检测过程中,我们并不是通过资源的名称来判定其是否冗余。如果资源本身是不同的,即使名称相同,UWA报告也不会判定是冗余。


UI 输入

Q3:Unity自带的UI Shader处理颜色时,改 _Color属性不会触发顶点重建吗?

在UI的默认Shader中存在一个Tint Color的变量,正常情况下,该值为常数(1,1,1),且并不会被修改。如果是用脚本访问Image的Material,并修改其上的Tint Color属性时,对UI元素产生的网格信息并没有影响,因此就不会引起网格的Rebuild。但这样做因为修改了材质,所以会增加一个Draw Call。


资源管理

Q4:移动游戏场景中,相同的怪物会动态合并吗?如下设置可行吗?
请输入图片描述
请输入图片描述

默认情况下,带蒙皮的Mesh是不支持动态合批的。如果场景中相同材质的蒙皮网格数量很多,可以考虑通过插件MeshBaker来进行合并,具体方法大家可以参考好插件让你事半功倍!


资源管理

Q5:EventSystem.Update()占用过高怎么优化?
请输入图片描述

EventSystem.Update 的开销分为两个部分:

  1. 来自被触发的响应事件,这部分的开销实际上并不属于事件系统本身,比如:某次点击触发了一个开销很高的逻辑函数,尤其是涉及到资源的加载和实例化。对于这类开销,我们建议通过Profiler.Begin/EndSample或者UWA提供的UWA API,对这些逻辑函数进行进一步的分析。

  2. 事件检测的开销,在默认情况下所有的UI元素都是事件检测的目标,因此当界面上UI元素数量很多,且长时间接触屏幕时,会有较高的持续开销。对于这类开销,我们建议通过以下几种方式来优化:
    a) 合理划分子Canvas,只有需要检测事件的界面才需要挂上GraphicRaycaster组件。
    b) 在Unity5.2之后的版本中,尽可能将不需要参与事件检测的UI元素的 Raycast Target 属性的勾选去掉。而对于Unity 4.x的版本,则可以尝试对UI部分的源码来进行修改以达到类似的效果。

  • 卢文龙 发表在 2018年08月20日 回复

    动同屏怪物数量的控制一直有所疑问,同模型怪物动作合并的上限是多少?