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

标签 c# garbage-collection unity3d

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

最佳答案

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

Is this okay?

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

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

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

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

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

enter image description here


另一个例子是 Update 函数:

GameObject obj = new GameObject("MyObject");

这很糟糕,因为 GameObject是一个。您正在每帧创建一个 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 .

And unity will handle this in someway, or no?

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

关于c# - 在 Update() 方法中创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45225999/

相关文章:

c# - 使用 Linq 将 xml 转换为类

c# - 自托管 SignalR 跨平台 SSL/TLS

c - 多个指针和标记和扫描

unity3d - 如何在统一的天空盒之间进行平滑过渡?

ios - 在iOS App中, Controller 未点击屏幕右侧

c# - 处置时不带变量的 using 语句有何作用?

c# - 如何在 C# 中将文档类型添加到新的 XML 文件

c++ - 处理 Mutex 对象

java - OS如何清理JVM的内存以及JVM如何清理堆中的对象?

c# - Unity3D OnPointerClick 是基于凸轮位置?