java 图片层级_UGUI图片层级和渲染顺序的奇怪关系

本文探讨了Unity中图片的渲染顺序与层级(Hierachy)的关系,特别是同一图集图片的合批问题。实验显示,图片的渲染顺序不仅受Hierachy层级和深度(Depth)影响,还涉及图集的渲染优先级。当图片Z轴位置改变时,渲染顺序可能发生调整,影响合批效果。最终总结出,相互重叠图片的渲染顺序由Hierachy决定,不重叠时由深度和图集优先级决定,而Z轴改变可提升图片渲染顺序。
摘要由CSDN通过智能技术生成

之前见别人的文章总是说,在Hierachy下,相同图集的图片要连续排列,这样Unity会对相同图集的图片进行合批,从而减少draw call。今天做了简单的试验发现情况并不是这么简单的。

第一种情况:

bc6d2ceef428c6d6872766a17e3bac53.png

如上图所示,在Hierachy下图片层级从低到高分别是(p,+,+),得到draw call为2。

第二张情况:

1b227475e9853eec4417267b9b1bd6a6.png

如上图所示,在Hierachy下图片层级从低到高分别是(+,p,p),得到draw call为3。

第三种情况:

6c6b1e5e7e351191d36373bf250a0191.png

如上图所示,在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。

90ae5ef153730454936ba6a9092d22f8.png

但是在上图的情况下,我们稍稍改变B的pos.z(无论正负),会发现draw call会由3降到2,如下图。通过分析FrameDebug下的Draw Mesh发现,渲染顺序变成了B(加号) - A(瓶子) - C(瓶子),后两次瓶子可以合批,一共两次draw call。

c44bba650d14b2fe93eb5946367a4cdb.png

我们再做一次试验,在加号的下面再放一张瓶子的图片,在所有图片z都是0的情况下有三次draw call,三次渲染结果如下:

3d448aa41310c13c92564bfa9fc8ced5.png

fdad4b43ef800b0b8bb02cb395b198a9.png

480d262950484c668bbcad41e140807f.png

如果改变加号图片的z,还是三次draw call,但是三次渲染的结果发生了变化,如下图:

19d80dbdc2adc27a402ecccc49e465e2.png

cb54b7eae1960cd7f626d9bd1f378014.png

781992a9396baac98626821deab416f1.png

结合上面两个例子可以粗略总结出,如果改变一个图片的z,它比所有Hierachy里在他下层的图片渲染顺序高,哪怕它的图集渲染优先级要低于其他图片的图集,但是如果遇到相互重叠图片,会由Hierachy下的顺序决定渲染顺序。

最后总结一下规律,如果相互重叠的图片,会由Hierachy下的顺序决定渲染顺序(不管任意图片的z)。不相互重叠的图片会由depth决定渲染顺序,同depth下的图片遵循一个默认的图集渲染的优先级决定渲染顺序(至于什么决定了不同图集的渲染优先级还不知道)。如果一个图片的z发生了改变,它会比所有Hierachy里在他下层的图片渲染顺序高(忽视depth和图集的渲染优先级)。只要是连续渲染顺序的同图集图片就会进行合批。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值