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

时间:2017-07-20 22:09:47

标签: c# unity3d garbage-collection unity5

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

1 个答案:

答案 0 :(得分:4)

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

  

这可以吗?

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

  • 如果是class,请不要在其中使用new关键字 Update功能。使用对象池或您将每帧创建新的对象。是的,这很昂贵。
  • 如果是struct,您可以在其中自由使用new关键字 没有Update函数。

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

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

这很好,因为Unity Vector3struct而不是class

enter image description here

另一个例子是Update函数:

GameObject obj = new GameObject("MyObject");

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

enter image description here

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

以下是其他事项:

1。C# value type vs reference type

2。is there a point in recycling value types unity

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

4。Object Pooling in Unity

请注意,此答案侧重于在问题中提及的Unity中使用new关键字。还有其他东西可以在不使用new关键字的情况下分配内存。示例包括在函数参数中使用param关键字,使用yield return 0 instead of yield return null在函数中返回数组。

  

团结会在某种程度上解决这个问题,还是不会?

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