LOADING

加载过慢请开启缓存 浏览器默认开启

UI性能优化—顶点数据传递UV参数

从 Sprite Atlas 与 UI 合批出发,理解材质参数和顶点数据的区别,尝试用顶点色、UV 等通道传递不同 UI 的效果参数。

1. 为什么不同的UI会打断合批

一谈到优化最常提到的就是合批和DrawCall,这里说的优化指的就是这样的小点。所谓合批,其实就是将渲染状态相同的的一堆模型当作一个模型拿去渲染。这样的话绘制就只需要一次了嘛,CPU就只会向GPU传递一次渲染命令,就是所谓的节省DrawCall。说了这么多,什么是相同渲染状态呢,非常粗浅,不准确的理解的话,可以当作是材质球相同的模型。绘制他们所需要传递的参数是相同的。

那么UI的话,实际上说的就是每个UI的材质球要相同,这句话乍一听其实是不太可能的,每个不重复的UI至少需要绘制不同的贴图吧,怎么可能要求每个UI材质不同呢?如果不上点特殊手段的话,确实,看下图,不同贴图的UI就是绘制了好多次,几个UI绘制了几次,完全没合批。

理所应当嘛,贴图是通过材质球来传递的,那当然几个UI就几个材质球咯。

2. 使用Sprite Atlas共享贴图

但Unity总有一些小妙招,如果只需要采样一张贴图,就可以采样到所有贴图就好了:Sprite Atlas登场!

所谓Sprite Atlas,就是unity的工具,用来把你用的一堆贴图合并成一张贴图的。在下图位置就可以找到:

UI性能优化—顶点数据传递UV参数示意图 1

有了它,就可以将所有贴图合并成一个图集:

UI性能优化—顶点数据传递UV参数示意图 2

这样就可以共享材质球,就可以合批啦!

UI性能优化—顶点数据传递UV参数示意图 3

可以看到,原本五次绘制,这里一次就给完成了,并且采样的贴图就是刚才的图集。

3. 通过顶点数据传递差异参数

这时候就有人提问了,UI不止可以添加贴图,还可以在下面位置改变颜色,是怎么做到不同参数却只用一个材质球实现的呢。

UI性能优化—顶点数据传递UV参数示意图 4

这里的颜色实际上并不是由Unity的材质传递的,如果有人翻过UI/Default的代码的话就会知道,实际上这个“Color”是顶点色,是模型的顶点数据,根本就不属于材质球的参数范畴。而不同的顶点色是不会打断合批的。

这其实就给了我们灵感,既然顶点数据不会打断合批,岂不是可以用模型的顶点数据来控制UI。如果自己的shader效果不需要顶点色数据的话,光顶点色就有4个通道,控制四个参数,此外还有UV1,法线(如果开了的话)等位置给你塞你自己的参数。如果你有些大规模渲染的UI,参数又不同的话,可以试试用这样的方式传递。