Unity图集优化原理
Posted ThomasQxx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity图集优化原理相关的知识,希望对你有一定的参考价值。
Unity-UGUI合批优化
- 图集合批规则
- 例如1:Blue,Green,Orange三个图片,没有打包图集时候。
- 例如2:Blue,Green,Orange三个图片,打包为一个图集
- 例如3:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Green,Orange.
- 例如4:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Orange,Green。
- 优化:所以理解了图集合批规则之后,就知道优化方向了
图集合批规则
计算层级号的算法:如果有一个UI元素,它所占的屏幕范围内(通常是矩形),如果没有任何UI在它的底下,那么它的层级号就是0(最底下);如果有一个UI在其底下且该UI可以和它Batch,那么它的层级号与底下的UI层级一样;如果有一个UI在其底下但无法与它Batch,那么它的层级号为底下的UI层级+1;如果有多个UI都在其下面,那么按前两种方式遍历计算所有的层级号,其中最大的那个作为自己的层级号。
合并时候:如果相邻间的两个批次正好可以Batch的话就会进行Batch。
Unity的UI渲染顺序的确定有2个步骤,第一步计算每个UI元素的层级号;第二步合并相同层级号中可以Batch的元素作为一个批次,并对批次进行排序;
例如1:Blue,Green,Orange三个图片,没有打包图集时候。
可以看到产生了三个DrawCall。原因:没有合并图集,需要CPU向GUI发送三次渲染请求。
例如2:Blue,Green,Orange三个图片,打包为一个图集
可以看到无论是否相交与否,都只产生了一个DrawCall。原因:三个图片都在同一个图集当中,渲染时候合批到一起,统一由CPU向GPU发送一次渲染请求即可
例如3:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Green,Orange.
可以看到无论是否相交,都只有2个DrawCall。原因:在Hierarchy面板中,先渲染Blue,在渲染Green,最后渲染Orange。这个顺序很重要,按照图集合并规则我们具体去分析,首先渲染Blue,计算他的层级序号,他的下面没有任何图片,所以他的层号为0。紧接着看Green,计算它的层级序号,它下面有一个图片Blue,并且Blue和Green在同一个图集当中 ,Unity引擎判定它可以合批后,它的层级序号和Blue一样为0。最后渲染Orange,他的下面是图片Green,由于Green和Orange的图片不在同一个图集,所以无法合批,它的层级序号就位0+1 = 1。
所以第一步:Unity引擎根据计算出Blue和Green层级号相同为0,而Orange层级号为1。
所以第二步:Unity引擎合并相同层级号中可以Batch的元素作为一个批次。Blue和Orange会被合批到一起由CPU向GPU发送一次渲染请求,也就是一个DC,而Orange单独由CPU向GPU发送一次渲染请求,也就是另外一个DC。所以有2个DC。
例如4:Blue,Green,Orange三个图片,Blue和Green打包到同一个图集,而Orange打包到另外一个图集,渲染顺序为Blue,Orange,Green。
第一步:Blue层级号为0,Orange层级号为0,Green层级号为0。
第二步:0层中Blue和Green可以合并到一个批次,而Orange不能,所以2个DC
操做:移动Orange覆盖Blue
第一步:Blue层级号为0,Orange层级号为1,Green层级号为0
第二步:0层级号中Blue和Green在同一图集可以合并到一个批次,1层级号Orange单独一个。所以2个DC
操做:移动Orange被Green覆盖
第一步:Blue层级号为0,Orange层级号为0,Green层级号为1
第二步:0层级中Blue和Orange不属于同一个图集无法合批,所以2个DC,1层级号中只有Green单独一个元素,所以单独一个DC。所以总共三个DC
操做:移动Green覆盖Blue
第一步:Blue层级号为0,Green层级号为0,Orange层级号为0
第二步:0层级号中Blue和Green可以合批,一个DC,Orange单独一个DC。所以2个DC
操做:移动Green覆盖Orange。和上面移动Orange被Green覆盖一个道理。这里还是说明一下
第一步:Blue层级号为0,Green层级号为1,Orange层级号为0
第二步:0层级中Blue和Orange不在同一个图集2个DC,1层级中Green单独一个DC。所以三个DC
操做:移动Blue被Orange覆盖和移动Orange覆盖Blue一个操做
第一步:Blue层级号为0,Orange层级号为1,Green层级号为0
第二步:0层级中Blue和Green在同一个图集可以合批,1个DC。1层级中Orange一个DC。所以2个DC
操做:移动Blue被Green覆盖。和移动Green覆盖Blue一个操做
第一步:Blue层级号为0,Orange层级号为0,Green层级号为0.
第二步:0层级号中Blue可以和Green合批。一个DC。Orange单独一个DC。所以2个DC
操做:移动Orange和Green如图所示
第一步:Blue层级号为0,Orange层级号为1,Green层级号为2.
第二步:0层级中Blue一个DC,1层级中Orange一个DC,2层级中Green一个DC。总共三个DC
操做:如图所示将三个图片叠起来
第一步:Blue层级号为0,Orange层级号为1,Green层级号为2
第二步:0层1一个DC,1层级一个DC,2层级一个DC。三个DC
优化:所以理解了图集合批规则之后,就知道优化方向了
DrawCall:就是CPU向GPU发送的一次渲染命令。
在降低DC方面,我们则需要做的就是尽可能的让CPU多打包一些信息给GPU,那么DC就自然降低了。在UGUI里面,先不考虑Shader,UI元素中材质和纹理相同的元素就可以被合批。
所谓的图集:将很多的2DSprite通过Atlas打包合并到一张大图,那么为什么要这么做?
1。CPU向GPU发送渲染命令时候,只需要大图就可以了,因为GPU会在这个大图中进行采样,然后根据规则生成界面。所以这里也就是为什么需要同一个图集的原因,如果真的只有一个图集,那么一个DC就可以把所有需要的信息传递给GPU,然后GPU就开始绘制。
2.图集尺寸是可选的,都为2的次数幂,图片尺寸为2的次数幂时候处理起来会比不规则的(图片尺寸不为2 的次数幂)快,就算美术给的图不是2的次数幂,但是打成图集之后也是2的次数幂。这是Unity的设计
3.理想化就是将所有的图打包为一个图集,这样就只会有一个DC了,但是这可能吗?如果图片资源非常多,那么这张图片可能就非常大了,资源就非常大了,Unity也不允许,所以设置了最大范围。所以这个时候我们就需要按照一定的设计规则去进行分类。我们当然是希望DC越少,资源越少。但这是一个互斥的话题。折中思想在古代就一直非常流行,所以都是去找一个平衡点。A:例如一些公共按钮,公共边框,作为公共资源尽可能打包到一个图集当中,如果不够就2-3个。B:按照功能模块进行划分;
以上是关于Unity图集优化原理的主要内容,如果未能解决你的问题,请参考以下文章
UNITY性能优化丨『图集』在 Unity 2019.x版本前的使用方法,及提供『图集自动化工具』
UNITY性能优化丨『图集』在 Unity 2020.1版本后的使用方法,及提供『图集自动化工具』