UGUI避坑指南

想到啥写啥吧,就随笔类似记录知识点一样一个个说,有空的话再编辑或者再开新帖具体讲讲某些点,都是UGUI优化的建议

(1)优化填充率,裁减掉无用的区域,镂空等。

(2)Mask的使用以及选择,或者用自用Mask,这块原理我在UGUI的合批里讲过,可以翻一翻我前面博客这里不再复述。

(3)少用unity自带的outline和shadow,会大量增加顶点和面数,比如outline,他实现原理是复制了四份文本然后做不同角度的便宜,模拟描边,要不就用自己实现的(挖坑待填)。

(4)操作全屏UI时建议将场景相机移走或者关闭,降低渲染面数,因为就算是被全屏UI遮挡住了,实际上后面的场景还是被渲染的占用资源。

(5)如果非特殊需求没必要使用CanvasPixedPerfect,因为比如在scrollView时,滑动视图时一直会导致不断重绘产生性能损耗。

(6)不需要接受点击时间的物件将RayCastTarget关掉减少事件响应,从底层看是因为UGUI的RayCastTarget的响应是从数组中遍历检测是否和用户的点击区域响应,所以能够缩减数组大小自然能够缩减遍历次数。

(7)UI动静分离,因为如果了解过Unity的UGUI源码就能发现Batch building 的过程,Canvas 会将其 ui 元素生成的 mesh 组合并生成合适的绘制命令给 Unity 渲染系统。并且过程的结果会被缓存并重用,直到 Canvas 重新被标记为脏。这会在组合的网格发生变化时发生。Canvas 会根据子节点里带有 Canvas Renderer 组件的 ui 来生成 网格,但是不包括 Sub-Canvas 的子节点,也就是说每个 Canvas 单独负责自身的 Batch building。Batch building 的过程会对根据深度、重叠测试、材质等对各个 Mesh 进行排序、分组、合并,这个过程是多线程的,在移动端(核心少)与桌面端(核心多)会呈现相当大的差异。Canvas下的某个元素进行变化时都会导致同一个Canvas下的所有元素都进行网格重建,这样会导致某些静态部分的网格被不同重绘导致额外性能损耗。而常用的拆分canvas有两种,一种是在同一个根节点下new一个动态Canvas,类似图示:

这种用法的缺点是层级关系不好调控,当静态Canvas下的某些物体需要显示在动态canvas下的物件上时就很麻烦。

所以我推荐第二种方式子Canvas的方式来实现这点。

类似上图在子物体上挂在subCanvas,这样的好处是它与其父节点是隔离的,Sub-Canvas 的 rebuild 不会逼迫父节点重建几何,反之亦然,不过还是存在一些边界情况。比如父节点变化导致子节点大小变化。但是Canvas会打断合批,所以比如只是拖拽某个组件的操作,可以在开始拖动时挂载subcanvas,结束拖动移除canvas,这样的做法能够保证物体的合批顺序,同时兼顾了动静分离。

(7)对于UI上常用的改变颜色的操作,不要使用Image组件上的Color属性改变颜色,这样会导致整个Canvas的重建,可以新建个材质,设置材质给Image的Material通过修改材质的颜色来达到同样效果

(8)对于界面上常用的组件隐藏,别使用SetActive来控制显影,有两种方式,一种是通过设置物体上的CullTransparentMesh并且控制物体透明度进行剔除,这个一般用于单个ui,如果是多个UI要不显示的话通过设置canvasGroups的Alpha控制显影。

(9)Text的组件的BestFit非必要别开,因为这样开启这个会不断生成各种尺寸的字号字体图集,增加不必要开销。

 下节写个具体的案例,这个也是很多人没注意并且可能都没发现的误区:

打断UGUI合批的肇事手段RectTransform

参考链接:https://zhuanlan.zhihu.com/p/266997416

posted @ 2020-10-28 11:07  陌冉  阅读(1011)  评论(2编辑  收藏  举报