我正在 Unity 中开发一款游戏。我正在使用行进立方体来创建可破坏的地形,它运行良好并且速度相当快(<10ms for a very large chunk of destruction in the worst case scenario). However, every 100 or so intersections I get a large GC spike of about 250ms. This isn't really acceptable.
我看到一些建议说使用对象池是解决这个问题的好方法,但是我可以完全避免 GC 吗?是的,我知道 C# 是一种 GC 语言,但如果我使用本机集合,我可以在完成后处理它们并避免 C# 的 GC(希望如此)。
我试图更好地理解这个选择:
本机集合还有其他注意事项/性能问题吗?
原生集合的
Dispose()
真的可以避免GC吗?
如果我这样做确实可以避免GC,为什么C#的集合不提供处置方法?
谢谢!
是的,您可以使用原生集合来避免GC。它们在非托管内存上运行。
但是无论如何使用对象池都是好的。 GC 峰值并不是这样做的唯一原因,对象池还有助于避免内存碎片。
如果您对整体性能感到满意,那么最好从 C# 集合的对象池开始,因为使用本机集合进行编程可能并不那么简单,并且性能影响可能很小。
要从本机集合中获得显着的性能提升,您需要以这种方式编写代码,这样它就可以爆发,这更不简单。
如果我这样做确实可以避免GC,为什么C#的集合不提供处置方法?
因为C#集合是托管集合。它们设计用于与 GC 一起使用。 C#使用GC的原因是内存安全。 Unity 使用 C# 而不是仅仅暴露 C++ 的原因可能是因为他们希望尽可能降低进入门槛。