我想在C#和.NET中做一個遊戲,並且我計劃實現在遊戲世界中更新遊戲對象的消息。這些消息將是C#引用對象。C#和.Net垃圾收集器性能
我想要這種方法,因爲如果我想讓遊戲成爲多人遊戲,以這種方式進行發送會更容易通過網絡發送。
但是,如果我有很多消息,對垃圾收集器來說不是很有壓力嗎?這不會影響遊戲玩法嗎?消息類本身很小,最多有4或5個成員。
對於遊戲世界中的每個對象,這些消息將每秒生成幾次。
我想在C#和.NET中做一個遊戲,並且我計劃實現在遊戲世界中更新遊戲對象的消息。這些消息將是C#引用對象。C#和.Net垃圾收集器性能
我想要這種方法,因爲如果我想讓遊戲成爲多人遊戲,以這種方式進行發送會更容易通過網絡發送。
但是,如果我有很多消息,對垃圾收集器來說不是很有壓力嗎?這不會影響遊戲玩法嗎?消息類本身很小,最多有4或5個成員。
對於遊戲世界中的每個對象,這些消息將每秒生成幾次。
在.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按需壓縮。
這是一個了不起的答案,我不知道爲什麼它沒有得到更多的選票。澄清了GC的工作原理(其中大部分我都不知道)。 +1 – 2013-09-24 03:22:22
你提供的鏈接是5歲,並指.NET 1.0和2.0;你知道框架4.0+是否也是如此嗎?謝謝 – 2013-09-27 12:37:27
剛剛發現了這個有關.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
.net中的GC是Generational。假設這些消息是短命的,那麼它們應該主要收集在0級世代中。如果是的話,性能不應該太差:) – Aron 2013-04-26 08:16:09
你可以在這裏要求更好的答案http://gamedev.stackexchange.com/ – 2013-04-26 08:17:25
通過網絡傳輸所有這些消息的開銷將是限制因素;相比之下,GC的開銷可能可以忽略不計。 – 2013-04-26 08:18:18