在 Update() 方法中创建新对象

Creating new objects in the Update() method

我在某处读到我不应该在游戏引擎的 Update() 方法中创建任何新的对象实例,因为这会导致唤醒垃圾收集器并降低性能,但有时我在一些教程中看到他们在 unity Update() 方法中使用 new 关键字!这个可以吗? unity 会以某种方式处理这个问题吗?

这对于新的C#程序员来说是一件令人困惑的事情。

Is this okay?

这个问题的答案取决于您使用 new 关键字的数据类型。这基本上是 值类型 引用类型 。有关详细信息,请参阅此答案末尾的 link。

  • 如果是 class,则不要在其上使用 new 关键字 Update 函数。使用对象池,否则您将在每一帧创建新对象。是的,这很昂贵。
  • 如果是struct,你可以随意在上面使用new关键字 Update 函数没有。

您可能在 Update 函数中看到过这样的代码:

Vector3 vec = new Vector3(0, 0, 0);

没关系,因为 Unity 的 Vector3struct 而不是 class


另一个例子是 Update 函数中的这个:

GameObject obj = new GameObject("MyObject");

这很糟糕,因为 GameObjectclass。您正在每帧创建一个 GameObject。在 Start 函数中执行一次,然后重新使用它。您还可以使用对象池。

注意红色圆圈文本,您可以使用它来确定您使用的 API 是 class 还是 struct

这里还有其他需要知道的事情:

1.C# value type vs reference type

2.

3.What's the difference between struct and class in .NET?

4.


请注意,此答案侧重于在您的问题中提到的在 Unity 中使用 new 关键字。还有其他一些东西甚至可以不使用 new 关键字就可以分配内存。示例包括在函数参数中使用 param 关键字,在函数中返回数组,使用 .

And unity will handle this in someway, or no?

唯一可以回答这个问题的是你的设备运行这个代码在。通常,由于 GC 运行,您会在移动设备上遇到一些问题。对象池在移动设备上非常重要。