赞
踩
在Unity性能优化UGUI篇里,优化UGUI主要对内存、DrawCall等进行优化。以下为常见的优化方法。
在大部分游戏里静态的UI要比动态的UI要多的,因此我们可以进行UI的动静分离,设置动态canvas和静态canvas,这样能够很大减少DrawCall的数量。
将多个小的UI图片合并到一个大的图集中,减少材质的数量,从而降低 DrawCall。
尽量一个界面的UI所用到的资源放在同一个图集中,一些公用的图片放到一张公用的图集中,当我们打开一个界面时只需要把对应的图集加载到内存中就可以了,也优化了内存。
UI实例化到场景中的过程:网格合并,组件初始化,渲染初始化,图片加载,界面逻辑调用等,消耗大量CPU。
预加载:把资源加载到内存、UI实例化和UI初始化的CPU消耗放在loading等待时间线上 (尤其是在AB包的使用上,可提前加载资源,比如在登录过程中、场景切换的时间等都可以提前加载资源)
在项目里没有用到的图片一定要删除,减少内存的使用。
Resources文件夹下的无用图片以及资源,一定要删除掉,因为Resources下的文件不管是否有引用都会被打进包体。
当项目过大时,需要频繁的使用创建和销毁UI对象,这样很消耗内存资源等情况,可以使用对象池进行资源的管理,需要时去池子里去取,不需要时还给池子。(对象池的具体使用就不在这里介绍了)
(1)使用动态字体时要谨慎,因为它们可能会导致较高的性能开销。如果可能,尽量使用静态字体。新版Unity提供了TMP字体组件,同样会生成纹理和图集,相比Text优势是,TMP是矢量字算法,mesh顶点数少,字体同源,各语言能同屏显示。
(2)避免使用BestFit功能
BestFit功能会不断计算和调整字体大小可能会带来一定的性能开销,特别是在文本频繁更新的情况下。
这些组件会使文本的Mesh顶点增加,导致开销过大。
当我们创建一个UI组件时,RayCastTarget是默认勾着的,不需要交互的UI组件,可以将RayCastTarget关闭。
避免将Image和Text的顺序进行交叉,因为相同材质的Image之间是可以合批的,当有Text交叉之后,就会打断Image之间的合批,从而增加了DrawCall。
多个Mask之间可以进行合批,需要同渲染层级(depth), 同材质, 同图集。
RectMask2D本身不产生DrawCall,并且不同RectMask2D的子对象之间不能合批。
所以可以根据项目的具体情况进行选择。
当ScrollView中的内容过多或复杂时,可能会导致性能下降,特别是在频繁滚动的情况下。
利用对象池的原理来进行优化,比如要显示20个数据,屏幕中一次性只能看到5个元素,可以利用的GameObject只有6个,5个用于显示,1个用于缓存。
在开发项目时可以使用多套UI贴图,比如高清、超清两套贴图,根据不同的机型或者手机性能,来使用不同的贴图。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。