自从我在 Unity 开发的第一天起,我就看到一些提示和内容说我们永远不应该为 sprite 着色。如果我们想要不同颜色的 Sprite ,创建它们并将它们放置在相同的纹理中,然后交换不同颜色的 Sprite 。
原因是给 Sprite 着色会破坏批处理。
我创建了一个小演示。
情况一
6 个游戏对象使用相同的方形 Sprite 。这里不足为奇。在统计中,有1个批处理。 5个通过批处理保存。
情况二
6 个游戏对象再次使用了相同的方形 Sprite ,但这一次,它们都被染成红色,颜色值相同。
这不应该已经破坏了批处理吗?
情况三
为了完整起见,我给方形 Sprite 着色了不同的颜色。尽管如此,我们还是保存了 1 批和 5 批。什么都没有改变。
附加信息
- 我在一次通关中捕获了情况 1 和 2,在单独通关中捕获了情况 3。
- 我尝试通过更改
SpriteRenderer
的“颜色”字段直接在编辑器中为 Sprite 着色,并通过更改通过脚本 SpriteRenderer.color
.结果是一样的。
最佳答案
在 SpriteRenderer
组件上更改 Sprite 的颜色不应中断批处理。当您更改 SpriteRenderer 的 Sprite 、 Material ,甚至当您尝试使用 SpriteRenderer.material
属性访问 Material 时,会破坏批处理。
例如,
这中断批处理:
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.material.color = Color.red;
因为您正在访问资料。当您第一次访问 Material 属性时,它将创建新的 Material 实例。
这不会破坏批处理:
SpriteRenderer sr = GetComponent<SpriteRenderer>();
sr.color = Color.red;
不会,因为它没有访问 material
属性。尽管它不会破坏批处理,但它的一个问题是性能。这样做会影响性能。
关于c# - 有色 Sprite 实际上是在较新版本的 Unity 中进行批处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51359499/