在 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 的 Vector3
是 struct
而不是 class
。
另一个例子是 Update
函数中的这个:
GameObject obj = new GameObject("MyObject");
这很糟糕,因为 GameObject
是 class
。您正在每帧创建一个 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 运行,您会在移动设备上遇到一些问题。对象池在移动设备上非常重要。
我在某处读到我不应该在游戏引擎的 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 的 Vector3
是 struct
而不是 class
。
另一个例子是 Update
函数中的这个:
GameObject obj = new GameObject("MyObject");
这很糟糕,因为 GameObject
是 class
。您正在每帧创建一个 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 运行,您会在移动设备上遇到一些问题。对象池在移动设备上非常重要。