20

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

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

但是如果我有很多消息,垃圾收集器会不会很紧张?而且不会影响游戏吗?消息类本身非常小,最多只有 4 或 5 个成员。

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

4

2 回答 2

23

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

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

  • 分配超过大对象堆阈值。
  • 系统内存不足。
  • System.GC.Collect在第 2 代上调用。

问题是当收集大对象堆时,对象的内存被释放,但 LOH 没有被压缩。SystemOutOfMemory因为 LOH 是碎片化的,如果 LOH上没有足够大的空间容纳您的对象,您可能会引发异常。

诸如对象池之类的技术通常用于提高 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。

于 2013-04-26T09:17:28.950 回答
18

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

如果您的对象是短暂的,它们大部分时间不应从第 0 代传递。级别 0 是 GC 清理速度最快的一代。

归根结底,我不会因为担心 GC 性能而考虑过早优化我的代码。

DonaldKnuth过早的优化是万恶之源

就个人而言,我推荐这篇文章以获得更深入的理解

于 2013-04-26T08:23:33.160 回答