U3DC.COM | 优三帝研究院

Menu

Unity UGUI优化建议

UGUI是unity官方开源的一套简单易用的UI框架,虽然简单易用,但如果不注意性能方面的优化,最后也可能会做出不佳的体验效果。以下几点是通过实战项目的总结得出来的优化建议,希望对使用UGUI框架的unityer有参考意义。

1.动静分离

跟canvas的渲染机制有关,即如果一个ui元素始终是静态的,那么画布则不会重新计算绘制,如果是动态的则不然,所以,这里建议将动态和静态的元素分开。静态的元素从属一个canvas,而需要动态变动的元素从属另一个canvas。

 

2.消除不必要的射线检测(raycast)

默认情况下,canvas自带Graphic Raycaster组件,这对于交互型的UI是必须的,但如果你的UI元素并不需要交互,那么每次点击都会触发判断,这种情况下,你就可以删除Graphic Raycaster组件以减少不必要的计算处理。同样的,各种其他UI元素,如图片、文本等也有Raycast Target属性,如果不需要射线检测(触屏、点击),也可以一并关掉,减少计算量。

3.避免使用Camera.main

unity默认创建的相机为主相机(tag 为MainCamera),即main camera,可以通过unity api : Camera.main来直接获取,本质上,它是每次通过获取tag来取得的:

GameObject.FindGameObjectWithTag“ MainCamera”).GetComponent <Camera>()

所以,建议在awake函数中缓存一次,避免多次查找(GetComponent和Find等方法是很耗时的操作)。

Awake(){

_mainCamera = Camera.main;
 //与↓相同 
_mainCamera = GameObject.FindGameObjectWithTag“ MainCamera”).GetComponent <Camera>();
}

回到UGUI这边,当画布的渲染模式切换为world space时,event camera的值为none,如果不指定,它会默认指向main camera,每帧将会产生7-10次的查找操作。

4.慎用布局组件

布局组件是非常好用的功能组件,可以非常方便的用于元素内容的快速对齐排版。尽管如此,但你要是了解它的底层操作原理,你以后使用就会慎重了。因为每个布局组件会将一个GetComponents调用添加到每个子布局元素的脏读中,从而严重降低了嵌套布局组的性能。

另外:unity scroll rect 的实现,也是一个Layout Group 。

5.合并UI对象

对象被重复销毁和创建的时候,我们会考虑用对象池来优化,但是这样会产生一个新问题:UI元素被重新设置,禁用和合并,这会导致Canvas不必要地变脏。

推荐优化方法:

//隐藏不再使用的内容,然后 
_text.gameObject.SetActive(false);

//移动画布
_text.transform.SetParent(_objectPoolCanvas.transform);

下次使用的时候:

//从ObjectPoolCanvas移至Canvas之后,
_text.transform.SetParent(_canvas.transform);

//显示 
_text.GameObject.SetActive(true);

6.如何隐藏画布

通常我们禁用一个物件,使用的gameobject.setactive(true),如果我们这样禁用画布canvas的话,会触发画布显示重建,同时还会调用ondisable和onenable,增加了计算量。

推荐方法:_canvas.enable = false;

7.使用tween库而不是animator

有时候,UI会配合动画来做一些效果,但是应该避免空的动画,即使动画值没变,动画却依然会弄脏元素,导致canvas不断重建。所以 UGUI中不使用没有任何变化的空闲动画.

推荐方式:自己写补间动画,或者直接使用三方补间库(如dotween等)。


博主公众号:优三帝

打赏
— 于 共写了1660个字
— 文内使用到的标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据