我正在尝试用 C# 和 .NET 制作游戏,并且计划实现更新游戏世界中游戏对象的消息。这些消息将是 C# 引用对象。
我想要这种方法,因为如果我希望游戏是多人游戏,那么通过网络发送它们会更容易。
但是如果我有很多消息,对于垃圾收集器来说不是压力很大吗?而且这不会影响游戏玩法吗?消息类本身非常小,最多只有 4 或 5 个成员。
这些消息每秒将为游戏世界中的每个对象生成几次。
在.NET中,垃圾收集器有3代,第0代、第1代和第2代。每次GC在一代中收集对象失败时,该对象将被提升到下一代。
如果您的对象大于 85kb,您可能会遇到问题。这些对象会自动存储在大对象堆中。大对象堆在以下情况下会被自动收集:
- 分配超出了大对象堆阈值。
- 系统内存不足。
-
System.GC.Collect
在第 2 代上调用。
问题是,当收集大对象堆时,对象的内存会被释放,但 LOH 不会被压缩。由于 LOH 是碎片化的,因此您可能会得到SystemOutOfMemory
如果 LOH 上没有足够大的空间容纳您的对象,则会抛出异常。
对象池等技术通常用于提高 LOH 的性能。http://en.wikipedia.org/wiki/Object_pool_pattern http://en.wikipedia.org/wiki/Object_pool_pattern
Source: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx http://msdn.microsoft.com/en-us/magazine/cc534993.aspx
UPDATE:.Net 4.5.1 将允许您使用 GC.Collect API 在应用程序中按需压缩 LOH。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)