0

我的场景中有 81 个游戏对象。当我玩 3 批次时,统计数据很健康。但是当我在脚本中访问渲染器时,每个对象的批次计数都会增加。在我访问所有对象的渲染器后,情况变得很糟糕。

之前:批次:3 | 通过批处理保存:80 | FPS:近 400

之后:批次:83 | 通过批处理保存:0 | 帧数:约 200

代码: transform.GetComponent<Renderer>().material.color = Color32.Lerp(start_color, target_color,t);

我觉得这个问题很有道理。“为什么 Unity3D 没有在访问渲染器之前对对象进行批处理?为什么即使在我对游戏对象进行了工作之后,批处理计数仍然有效?”


更新: 1. 即使我只是简单地访问渲染器而不更改它,它也会花费一批并且永远不会减少。

start_color = transform.GetComponent<Renderer>().material.color;
  1. 我通过 lerp 改变颜色来缩放对象。在检查器中,材质被重命名为 mat(instance)。

  2. 我尝试使用 sharedMaterial。现在批次计数稳定为 3,但所有 81 个对象都变为相同的颜色。故事: 81 可以更新为具有不同灰度的低、中、高状态。我需要在更新时对它们进行分类。

4

2 回答 2

1

每次更改材质的任何属性时,都会创建材质的实例。这就是为什么您的对象不通过批处理保存的原因。

于 2015-12-12T15:05:39.070 回答
1

@VladislavKurenkov 是对的。还有另一个技巧,但它并非在所有情况下都有效 - 而不是通过GetComponent().material引用材料,只需创建一个Material类型的公共变量。然后在该变量上修改您想要的任何内容,所有转换都会受到影响。只需将您的资产中的材料送入检查器插槽即可。这将保存批处理。

于 2015-12-12T17:05:31.450 回答