2013-04-26 19 views
17

Sto cercando di creare un gioco in C# e .NET, e stavo pianificando di implementare messaggi che aggiornano gli oggetti del gioco nel mondo di gioco. Questi messaggi sarebbero oggetti di riferimento C#.C# e. Net prestazioni del garbage collector

Voglio questo approccio perché farlo in questo modo sarebbe più facile inviarli su una rete se voglio che il gioco sia multiplayer.

Ma se ho un sacco di messaggi, non sarà abbastanza stressante per il garbage collector? E non influenzerà il gameplay? Le classi dei messaggi stessi sono piuttosto piccole con 4 o 5 membri al massimo.

Questi messaggi verranno generati un paio di volte al secondo per ogni oggetto nel mondo di gioco.

+2

Il GC in .net è di tipo generazionale.Supponendo che i messaggi siano di breve durata, dovrebbero essere per lo più raccolti nella generazione di Livello 0. Se così fosse, le prestazioni non dovrebbero essere troppo male :) – Aron

+2

puoi chiedere qui per risposte migliori http://gamedev.stackexchange.com/ –

+4

Il sovraccarico di trasmettere tutti quei messaggi su una rete sarà il fattore limitante; l'overhead del GC sarà probabilmente trascurabile al confronto. –

risposta

17

Il GC nelle versioni successive, ma più precisamente 4.5, viene eseguito in modo asincrono per i livelli di generazioni 0 e 1. Ciò ha ridotto notevolmente l'impatto di GC.

Se gli oggetti sono di breve durata non dovrebbero passare dal livello di generazione 0 maggior parte del tempo. Il livello 0 è la generazione più veloce da ripulire dal GC.

Linea di fondo, che non mi dispiacerebbe prematuramente ottimizzare il mio codice per paura di prestazioni GC.

ottimizzazione prematura è la radice di tutti i mali da DonaldKnuth

Personalmente, vi consiglio questo article per una più profonda comprensione

+0

+1 per aver citato Knuth! :) – Carsten

+0

che aiuta davvero. Stavo pensando di creare il gioco su .net 4.5 in ogni caso – Alecu

18

In .NET il garbage collector ha 3 generazioni, generazione 0, generazione 1 e generazione 2. Ogni volta che il GC non riesce a raccogliere un oggetto in una generazione, quell'oggetto verrà promosso alla generazione successiva.

Potresti incorrere in problemi se i tuoi oggetti sono più grandi di 85kb. Questi oggetti verranno automaticamente archiviati nell'heap di oggetti di grandi dimensioni. Il grande mucchio oggetto verranno raccolte automaticamente nelle seguenti situazioni:

  • allocazioni superano la soglia grande oggetto cumuli.
  • Il sistema si trova in una situazione di memoria insufficiente.
  • System.GC.Collect è chiamato generazione 2.

Il problema è che quando il grande mucchio oggetto viene raccolto, la memoria per gli oggetti si rilascia ma la LOH non viene compattato. Poiché il LOH è frammentato, potresti potenzialmente ottenere le eccezioni SystemOutOfMemory generate se non c'è uno spazio abbastanza grande per il tuo oggetto sul LOH.

Tecniche come il pool di oggetti sono comunemente utilizzate per migliorare le prestazioni del LOH. http://en.wikipedia.org/wiki/Object_pool_pattern

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

UPDATE: .Net 4.5.1 vi permetterà di fare la compattazione su richiesta del LOH all'interno dell'applicazione utilizzando l'API GC.Collect.

+1

Questa è una risposta sorprendente e non so perché non abbia ottenuto voti più alti. Chiarito molto su come funziona il GC (la maggior parte delle quali non lo sapevo). +1 –

+0

Il collegamento che hai fornito ha 5 anni e si riferisce a .NET 1.0 e 2.0; Sai se lo stesso vale per il framework 4.0+? Grazie –

+0

Ho appena trovato questo link sulle modifiche LOH in .NET 4.5; http://blogs.msdn.com/b/dotnet/archive/2011/10/04/large-object-heap-improvements-in-net-4-5.aspx –