我在某处读到我不应该在游戏引擎的 Update() 方法中创建任何新的对象实例,因为这会导致唤醒垃圾收集器并降低性能,但有时我在他们使用的一些教程中看到unity Update() 方法中的新关键字!这个可以吗? Unity 会以某种方式处理这个问题吗?
最佳答案
对于新的 C# 程序员来说,这是一件令人困惑的事情。
Is this okay?
这个问题的答案取决于您使用 new
关键字的数据类型。这基本上是值类型与引用类型。有关这方面的更多信息,请参阅此答案末尾的链接。
- 如果它是一个
class
,那么不要在它上面使用new
关键字更新
函数。使用对象池,否则您将在每一帧创建新对象。是的,这很昂贵。 - 如果它是一个
struct
,你可以在它上面自由使用new
关键字Update
函数没有。
你可能在 Update
函数中看到过这样的代码:
Vector3 vec = new Vector3(0, 0, 0);
这很好,因为 Unity 的 Vector3
是 struct
而不是 class
。
另一个例子是 Update
函数:
GameObject obj = new GameObject("MyObject");
这很糟糕,因为 GameObject
是一个类
。您正在每帧创建一个 GameObject。在 Start
函数中执行一次,然后重新使用它。您还可以使用对象池。
注意红色圆圈文本,您可以使用它来确定您使用的 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?
请注意,此答案侧重于在您的问题中提到的在 Unity 中使用 new
关键字。还有一些东西甚至可以不使用 new
关键字就可以分配内存。示例包括在函数参数中使用 param
关键字,在函数中返回数组,使用 yield return 0
instead of yield return null
.
And unity will handle this in someway, or no?
唯一可以回答这个问题的是您运行此代码的设备。通常,由于 GC 运行,您会在移动设备上遇到一些问题。对象池在移动设备上非常重要。
关于c# - 在 Update() 方法中创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45225999/