2013-04-26 11 views
17

Próbuję zrobić grę w C# i .NET, a ja planowałem wprowadzić komunikaty, które aktualizują obiekty gry w świecie gry. Te wiadomości będą obiektami odniesienia C#.C# i .Net Spalacz wydajności

Chcę tego podejścia, ponieważ w ten sposób łatwiej byłoby wysłać je przez sieć, jeśli chcę, aby gra była wieloosobowa.

Ale jeśli mam dużo wiadomości, czy nie będzie to dość stresujące dla śmieciarza? I czy to nie wpłynie na rozgrywkę? Klasy wiadomości same w sobie są dość małe z maksymalnie 4 lub 5 członkami.

Wiadomości te będą generowane kilka razy na sekundę dla każdego obiektu w świecie gry.

+2

GC w .net ma charakter pokoleniowy.Zakładając, że komunikaty są krótkotrwałe, powinny być w większości zbierane w pokoleniu poziomu 0. Jeśli tak, wydajność nie powinna być zbyt zła :) – Aron

+2

możesz tu zapytać o lepsze odpowiedzi http://gamedev.stackexchange.com/ –

+4

Koszt przesłania wszystkich wiadomości przez sieć będzie czynnikiem ograniczającym; koszty ogólne GC będą prawdopodobnie nieistotne w porównaniu. –

Odpowiedz

17

GC w późniejszych wersjach, ale dokładniej 4.5, działa asynchronicznie dla generacji poziomu 0 i 1. To znacznie zmniejszyło wpływ GC.

Jeśli twoje obiekty są krótkotrwałe, nie powinny przechodzić z poziomu 0 przez większość czasu. Poziom 0 jest najszybszą generacją do wyczyszczenia przez GC.

Podsumowując, nie rozważałbym przedwczesnej optymalizacji kodu z obawy przed działaniem GC.

Przedwczesna optymalizacja jest korzeniem wszelkiego zła przez DonaldKnuth

Osobiście polecam ten article dla głębszego zrozumienia

+0

+1 za zacytowanie Knutha! :) – Carsten

+0

to naprawdę pomaga. Planowałem stworzyć grę na .net 4.5 i tak – Alecu

18

W .NET garbage collector posiada 3 pokolenia, pokolenia 0, generacja 1 i generacja 2. Za każdym razem, gdy GC nie zbierze obiektu w pokoleniu, obiekt ten zostanie awansowany do następnego pokolenia.

Możesz potencjalnie napotkać problemy, jeśli obiekty są większe niż 85kb. Obiekty te będą automatycznie zapisywane w stosie dużych obiektów. Duża kupa obiektów zostanie automatycznie zebrana w następujących sytuacjach:

  • Alokacje przekraczają progi hałdy dużego obiektu.
  • System znajduje się w sytuacji niskiej ilości pamięci.
  • System.GC.Collect nazywa się na wytwarzaniu 2.

Problemem jest to, że przy dużych obiektów sterty zbiera pamięć dla obiektów jest zwalniane ale LOH nie zagęszcza. Ponieważ LOH jest pofragmentowane, potencjalnie można uzyskać wyjątki od SystemOutOfMemory, jeśli nie ma miejsca wystarczająco dużego dla obiektu na LOH.

Techniki takie jak łączenie obiektów są powszechnie stosowane w celu poprawy wydajności LOH. http://en.wikipedia.org/wiki/Object_pool_pattern

Źródło: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

UPDATE: Net 4.5.1 pozwoli Ci zrobić ugniatanie na żądanie z LOH w aplikacji przy użyciu API GC.Collect.

+1

To jest niesamowita odpowiedź i nie wiem, dlaczego nie zdobyła więcej głosów. Wyjaśniłem wiele o tym, jak działa GC (z których większość nie znałem). +1 –

+0

Podany link ma 5 lat i dotyczy domen .NET 1.0 i 2.0; Czy wiesz, czy to samo dotyczy platformy 4.0+? Dziękujemy –

+0

Właśnie znalazłem ten link o zmianach LOH w .NET 4.5; http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspx –

Powiązane problemy