为了账号安全,请及时绑定邮箱和手机立即绑定

有色精灵实际上是否在较新版本的 Unity 中进行批处理?

有色精灵实际上是否在较新版本的 Unity 中进行批处理?

C#
月关宝盒 2021-10-09 16:24:35
从我在 Unity 开发的第一天开始,我就看到一些提示和内容说我们永远不应该给精灵着色。如果我们想要不同颜色的精灵,创建它们并将它们放置在相同的纹理中,然后交换不同颜色的精灵。原因是着色精灵会破坏批处理。我创建了一个小演示。情况一在 6 个游戏对象中使用了相同的方形精灵。这里并不奇怪。在统计中,有 1 个批次。5个通过批处理保存。情况二同样的方形精灵再次用于 6 个游戏对象,但这一次,它们都被染成具有相同颜色值的红色。这不应该打破批处理吗?情况3为了完整起见,我用不同的颜色为方形精灵着色。尽管如此,我们还是保存了 1 个批次和 5 个。什么都没有改变。附加信息我在一次游戏中捕捉到了情况 1 和 2,在单独的游戏中捕捉到了情况 3。我试着着色精灵直接在编辑器通过改变“颜色”字段SpriteRenderer,并通过脚本改变SpriteRenderer.color。结果是一样的。
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

AFAIK,着色基本上是设置顶点颜色。这是为粒子完成的,您可以在其中设置随机开始颜色,并且所有粒子都在单个绘制调用中渲染。顶点颜色不会改变/创建新材质。

不确定在早期 Unity 版本中是如何处理的,但精灵应该是简单的四边形,因此支持顶点颜色。Sprite 着色器在着色方面的工作方式可能相同。

一般来说,你是对的。更改着色器属性将创建该材质的副本,或者它会更改材质本身并影响使用该材质的所有实例。你是在 sprite 材质上还是在 spriteRenderer 上使用了色调?

手动,我可以想到使用 MaterialPropertyBlocks,但也许 Unity 正是为精灵做到了这一点。


更多细节需要澄清:

A你有“Material01.mat”——它是绿色的。您将此材质复制到 10 个精灵。你想要10种颜色?您必须创建 10 个材质,每个材质都包含所需的颜色 - 10 个 Draw 调用。

您可以通过脚本执行相同的操作,只需更改 material.color。但是 Unity 会为您复制材料。还有 10 次 Draw 调用。有些人在听到这个消息之前对为什么它会中断批处理感到困惑。

B你改变了渲染器的色调。这个精灵渲染器将使用顶点颜色属性将色调颜色写入您的精灵顶点(可能是 4 个?)。它基本上是免费的,因为它们无论如何都会传输到 gpu (afaik)

正如我上面所说,在粒子系统中也使用了相同的方法,以允许具有 1 个 Drawcall 的彩虹粒子。

因此,任何粒子着色器、自写着色器或精灵着色器都应该与此配合使用。所有你需要的是a.albedo = c.rgb * IN.vert.color(这里有点伪代码)

这意味着,相同的着色器和相同的材质可用于具有不同顶点颜色的多个对象。这不会破坏批处理。

你甚至可以有任何形状和顶点数的不同对象,给它们不同的顶点颜色(每个顶点,如渐变等),它仍然会批处理。

尽可能检查静态,将信息输入顶点颜色,对于移动对象,尽量将它们保持在 300 个顶点以下,以便动态批处理可以工作。

但是对于 Sprites,unity 会为您自动执行此操作,您只需要使用 SpriteRenderer - 这就是为什么您不使用带有纹理的四边形,而是使用“Sprite”和 SpriteRenderer。

同样,我可能是错的,SpriteRenderer 实际上使用 MaterialPropertyBlocks,但它的工作原理几乎相同。这些变量可以针对每个对象进行设置,并且不会创建新的 DrawCall。变量值在着色器中使用,因此多个对象的材质/着色器是相同的。


查看完整回答
反对 回复 2021-10-09
  • 2 回答
  • 0 关注
  • 205 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信