C#和.Net垃圾收集器性能

我正在尝试用C#和.NET制作游戏,并且我计划实现更新游戏世界中游戏对象的消息。 这些消息将是C#引用对象。

我想要这种方法,因为如果我想让游戏成为多人游戏,那么这样做会更容易通过网络发送它们。

但是,如果我有很多消息,对垃圾收集器来说难道不会很紧张吗? 这不会影响游戏玩法吗? 消息类本身很小,最多只有4或5个成员。

对于游戏世界中的每个对象,这些消息将每秒生成几次。

更高版本的GC,更准确地说是4.5,在0级和1级的代数中异步运行。这大大降低了GC的影响。

如果您的对象是短暂的,它们不应该在大多数时间从第0代传递。 0级是GC清理的最快代。

最重要的是,我不会因为担心GC性能而过早地优化我的代码。

过早的优化是 DonaldKnuth 所有邪恶的 根源

就个人而言,我建议这篇文章有更深入的了解

在.NET中,垃圾收集器有3代,第0代,第1代和第2代。每次GC无法在一代中收集对象时,该对象将被提升为下一代。

如果对象大于85kb,则可能会遇到问题。 这些对象将自动存储在大对象堆中。 在以下情况下将自动收集大对象堆:

  • 分配超过大对象堆阈值。
  • 系统处于低内存状态。
  • 在第2代调用System.GC.Collect

问题是,当收集大对象堆时,对象的内存被释放,但LOH没有被压缩。 因为LOH是碎片化的,所以如果没有足够大的空间用于LOH上的对象,则可能会抛出SystemOutOfMemoryexception。

诸如对象池之类的技术通常用于改善LOH的性能。 http://en.wikipedia.org/wiki/Object_pool_pattern

来源: http : //msdn.microsoft.com/en-us/magazine/cc534993.aspx

更新: .Net 4.5.1允许您使用GC.Collect API在您的应用程序中按需压缩LOH。