Unity3D UGUI(又名“新UI”)绘图调用优化

Unity3D UGUI(又名“新UI”)绘图调用优化,unity3d,Unity3d,我们最近创建了一个资产,该资产在“新建”(>4.6)Unity UI的表布局中显示数据。我们的一些用户询问了draw调用的性能,我们想知道有什么(如果有的话)选项可以改进UI中的draw调用 因此,上表在19次抽签时保持一致 它在任何ipad2及以上级别上都可以正常运行,但Unity dev(可以理解)讨厌draw调用,所以我们希望尽可能减少该数量 您可以在上面的屏幕截图中看到我们为表创建的层次结构。我们正在为页眉/页脚/正文和ColumnOverlay使用遮罩。每个单位,每个遮罩似乎至少进

我们最近创建了一个资产,该资产在“新建”(>4.6)Unity UI的表布局中显示数据。我们的一些用户询问了draw调用的性能,我们想知道有什么(如果有的话)选项可以改进UI中的draw调用

因此,上表在19次抽签时保持一致

它在任何ipad2及以上级别上都可以正常运行,但Unity dev(可以理解)讨厌draw调用,所以我们希望尽可能减少该数量

您可以在上面的屏幕截图中看到我们为表创建的层次结构。我们正在为页眉/页脚/正文和ColumnOverlay使用遮罩。每个单位,每个遮罩似乎至少进行2次绘制:

此外,我们显然使用了一组UnityUI文本和精灵元素来绘制所有内容。表格布局的基本性质几乎意味着有多个层次的精灵和文本对象相互重叠(单元格背景上的单元格数据等)。Unity dev似乎说,当这种情况发生时,根本没有办法不进行多个draw调用,因为引擎需要每个“层”进行一次draw。。。句号

所以。。。看起来,只要在Unity UI中有一个非平凡的UI布局,就可以保证有非平凡(10-20)数量的draw调用。这是真的吗?如果不是,有没有人对我们可以做些什么来减少表中的抽签有什么想法

更新1: 通过停用每个数据行上的自定义“度量”元素,我可以将绘图调用减少一个。它基本上是一个被黑客攻击的“文本”对象,但我只是用它来测量网格大小的单元格,它需要额外的绘图调用。测量功能实际上可以在游戏对象停用时正常工作

当前绘图调用==18 更新2: 发现了很大的改进。我在上面提到,我的页眉/页脚/正文和ColumnOverlay都使用masks元素。事实证明,我能够重新构造我的系统,在一个新的根级别元素上包含一个掩码,并移除页眉、页脚和ColumnOverlay上的掩码。现在我在根元素和主体上有了一个掩码

当前绘图调用==13 更新3[故障]: 因此,每一行都包含底部边界线图像,以使其与同级图像偏移。我想可能是在文本元素的“顶部”打印,并强制进行额外的绘制。结果没有。。。不是

还有。。。我的所有背景图像元素都没有定义精灵属性。他们只是在应用颜色时使用“null”。我想,如果我创建一个普通的“白色”精灵并将其应用于所有空图像对象,可能会改进批处理并减少绘制调用。结果没有。。。没有


当前绘图调用==13据我所知,您的问题是UI批处理

现在我将尝试解释它是如何工作的

当您在Unity中创建一个空场景时,由于您的相机和画布,您只有一个绘制调用。让我们看看下面的图片:

因此,当您向场景添加新的
图像
对象时,您将获得一个新对象

这是因为您向场景添加了新材质。如果添加更多具有相同材质的对象,它们将被批处理到一次绘制调用中,而不会生成新的绘制调用

如果将具有新材质的对象添加到场景中,则会生成额外的绘制调用

看起来还可以。但是,如果具有新材质的对象位于层次中的批处理对象之间,并且与其中任何一个对象相交,则会出现问题。batchig将被分成两部分,并将生成两个drow调用


所以我认为你的问题在这里。您需要仔细查看层次结构,并记住,
图像
文本
对象具有不同的材质。因此,当文本的形状与图像的形状相交时,位于两个相距
Image
对象之间的每个
Text
都会产生额外的绘图调用

那些图标在同一张精灵表上吗?是的,它们在。一旦我有一些循环要做,我将把所有的“空”精灵添加到一个通用填充精灵中,并进一步使用它(我在上面的“更新3”中提到的那个)。我不相信在这种情况下,我会用空精灵创建额外的draw调用,但我想再次检查并确保我没有遗漏任何东西。一个提示——我不知道如何在您的问题中最好地利用它——是使用更多的画布。Unity的画布对象必须在发生变化时重新评估所有内容。如果你把事情分解成更小的块(子或画布对象),它会减少排序复杂度,考虑使用TrasMask2D而不是掩码。此外,如果你的图像不是精灵填充,考虑打开雪碧封隔器,以进一步减少。使用雪碧封隔器减少绘制调用1的所有精灵。