2013-04-26 103 views
17

我想在C#和.NET中做一個遊戲,並且我計劃實現在遊戲世界中更新遊戲對象的消息。這些消息將是C#引用對象。C#和.Net垃圾收集器性能

我想要這種方法,因爲如果我想讓遊戲成爲多人遊戲,以這種方式進行發送會更容易通過網絡發送。

但是,如果我有很多消息,對垃圾收集器來說不是很有壓力嗎?這不會影響遊戲玩法嗎?消息類本身很小,最多有4或5個成員。

對於遊戲世界中的每個對象,這些消息將每秒生成幾次。

+2

.net中的GC是Generational。假設這些消息是短命的,那麼它們應該主要收集在0級世代中。如果是的話,性能不應該太差:) – Aron 2013-04-26 08:16:09

+2

你可以在這裏要求更好的答案http://gamedev.stackexchange.com/ – 2013-04-26 08:17:25

+4

通過網絡傳輸所有這些消息的開銷將是限制因素;相比之下,GC的開銷可能可以忽略不計。 – 2013-04-26 08:18:18

回答

17

GC在更高版本,但更準確地說4.5,異步運行幾代0和1.這大大降低了GC的影響。

如果你的對象是短命的,那麼大多數時候它們不應該從代0級通過。 0級是GC清理的最快的一代。底線,我不會考慮過早地優化我的代碼,因爲擔心GC的性能。

過早的優化是一切罪惡的 DonaldKnuth根

就個人而言,我建議這個article進行更深層次的理解

+0

引用Knuth +1! :) – Carsten 2013-04-26 08:29:11

+0

真的有幫助。無論如何,我打算在.net 4.5上製作遊戲 – Alecu 2013-04-26 09:10:04

18

在.NET中的垃圾收集器有3代,代0,第1代和第2代。每次GC無法收集一代中的對象時,該對象將被提升爲下一代。

如果對象大於85kb,則可能會遇到問題。這些對象將自動存儲在大對象堆中。大對象堆將在以下情況下自動收集:

  • 分配超出大對象堆的閾值。
  • 系統內存不足。
  • System.GC.Collect上調用代2.

的問題是,所收集的大對象堆時,對於對象的存儲器被釋放,但LOH並不壓實。因爲LOH是分散的,所以如果沒有足夠大的空間用於LOH上的對象,則可能會拋出異常拋出SystemOutOfMemory

諸如對象池等技術通常用於提高LOH的性能。 http://en.wikipedia.org/wiki/Object_pool_pattern

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

UPDATE:淨4.5.1將允許你這樣做使用GC.Collect的API應用程序中的LOH按需壓縮。

+1

這是一個了不起的答案,我不知道爲什麼它沒有得到更多的選票。澄清了GC的工作原理(其中大部分我都不知道)。 +1 – 2013-09-24 03:22:22

+0

你提供的鏈接是5歲,並指.NET 1.0和2.0;你知道框架4.0+是否也是如此嗎?謝謝 – 2013-09-27 12:37:27

+0

剛剛發現了這個有關.NET 4.5中LOH變化的鏈接; http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspx – 2013-09-27 12:39:46