c# - 有色 Sprite 实际上是在较新版本的 Unity 中进行批处理吗?

标签 c# unity3d sprite

自从我在 Unity 开发的第一天起,我就看到一些提示和内容说我们永远不应该为 sprite 着色。如果我们想要不同颜色的 Sprite ,创建它们并将它们放置在相同的纹理中,然后交换不同颜色的 Sprite 。

原因是给 Sprite 着色会破坏批处理。

我创建了一个小演示。


情况一

Situation 1

6 个游戏对象使用相同的方形 Sprite 。这里不足为奇。在统计中,有1个批处理。 5个通过批处理保存。


情况二

Situation 2

6 个游戏对象再次使用了相同的方形 Sprite ,但这一次,它们都被染成红色,颜色值相同。

这不应该已经破坏了批处理吗?


情况三

Situation 3

为了完整起见,我给方形 Sprite 着色了不同的颜色。尽管如此,我们还是保存了 1 批和 5 批。什么都没有改变。


附加信息

  1. 我在一次通关中捕获了情况 1 和 2,在单独通关中捕获了情况 3。
  2. 我尝试通过更改 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/

相关文章:

unity3d - 上传音频文件时统一显示音频频谱(波形)

android - Crashlytics Unity 插件 - 导出到 Android Studio

java - 尝试使 Sprite 围绕一个点旋转(LibGDX/Java)

libgdx - 在 libgdx 中高效使用多个纹理

c# - Dispatcher.BeginInvoke 和 Task.Factory.StartNew 有什么区别

c# - 为什么不指定“ref”就可以从方法更改Struct的int []属性?

c# - 如何在 Unity 中编写 Sprite 之间的淡入淡出过渡?

C#:如何在检查相等性时评估一个对象的多个计算机类?

c# - Unity 5.2.2 将 Visual Studio 改回 MonoDevelop

html - Sprite 正在缩放而不是裁剪