之前见别人的文章总是说,在Hierachy下,相同图集的图片要连续排列,这样Unity会对相同图集的图片进行合批,从而减少draw call。今天做了简单的试验发现情况并不是这么简单的。
第一种情况:
如上图所示,在Hierachy下图片层级从低到高分别是(p,+,+),得到draw call为2。
第二张情况:
如上图所示,在Hierachy下图片层级从低到高分别是(+,p,p),得到draw call为3。
第三种情况:
如上图所示,在Hierachy下图片层级从低到高还是(+,p,p),只不过我把p的图片由瓶子换成了一个鸡蛋,其实就是换了一个图集,得到draw call为2。
目前总结来的结论应该是这样的,如下图所示,A,B两张图应该是先渲染的,因为它们分别处于更远的depth,C是后渲染的,因为它处于更近的depth。但是A和B谁先渲染决定与它们使用的图集,这个优先级在我刚刚举的三个例子中应该是 瓶子图集 > 加号图集 > 鸡蛋图集。所以在下图中 A和B应该是先渲染A,所以渲染顺序是 A(瓶子) - B(加号) - C(瓶子),无法合批,一共三次draw call。但是如果把瓶子换成鸡蛋,那么A和B应该是先渲染B,所以渲染顺序是 B(加号) - A(鸡蛋) - C(鸡蛋),后两次鸡蛋可以合批,一共两次draw call。
但是在上图的情况下,我们稍稍改变B的pos.z(无论正负),会发现draw call会由3降到2,如下图。通过分析FrameDebug下的Draw Mesh发现,渲染顺序变成了B(加号) - A(瓶子) - C(瓶子),后两次瓶子可以合批,一共两次draw call。
我们再做一次试验,在加号的下面再放一张瓶子的图片,在所有图片z都是0的情况下有三次draw call,三次渲染结果如下:
如果改变加号图片的z,还是三次draw call,但是三次渲染的结果发生了变化,如下图:
结合上面两个例子可以粗略总结出,如果改变一个图片的z,它比所有Hierachy里在他下层的图片渲染顺序高,哪怕它的图集渲染优先级要低于其他图片的图集,但是如果遇到相互重叠图片,会由Hierachy下的顺序决定渲染顺序。
最后总结一下规律,如果相互重叠的图片,会由Hierachy下的顺序决定渲染顺序(不管任意图片的z)。不相互重叠的图片会由depth决定渲染顺序,同depth下的图片遵循一个默认的图集渲染的优先级决定渲染顺序(至于什么决定了不同图集的渲染优先级还不知道)。如果一个图片的z发生了改变,它会比所有Hierachy里在他下层的图片渲染顺序高(忽视depth和图集的渲染优先级)。只要是连续渲染顺序的同图集图片就会进行合批。