我在某处读到了我不应该在游戏引擎的Update()方法中创建任何新的对象实例,因为这会导致唤醒垃圾收集器并降低性能,但有时我会在一些教程中看到他们使用统一Update()方法中的新关键字!这个可以吗?团结会在某种程度上解决这个问题,还是不会?
答案 0 :(得分:4)
对于新的C#程序员来说,这是一件令人困惑的事情。
这可以吗?
答案取决于您使用new
关键字的数据类型。这基本上是值类型与引用类型。有关详细信息,请参阅本答案末尾的链接。
class
,请不要在其中使用new
关键字
Update
功能。使用对象池或您将每帧创建新的对象。是的,这很昂贵。struct
,您可以在其中自由使用new
关键字
没有Update
函数。您可能在Update
函数中看到过这样的代码:
Vector3 vec = new Vector3(0, 0, 0);
这很好,因为Unity Vector3
是struct
而不是class
。
另一个例子是Update
函数:
GameObject obj = new GameObject("MyObject");
这很糟糕,因为GameObject
是class
。您正在每帧创建一个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
在函数中返回数组。
团结会在某种程度上解决这个问题,还是不会?
唯一可以回答此问题的是您在上运行此代码的设备。通常,由于GC运行,您在移动设备上会遇到一些问题。对象池在移动设备上非常重要。