2010-07-09 7 views
5

Attualmente sto sviluppando un motore di gioco C# .net xna.Prestazioni del delegato C# nel gioco xna

Ho cercato di capire un modo per avere un gestore aggiornamenti/scheduler/sistema di eventi. Attualmente sto usando i delegati per fornire un modo per creare attività ed eventi programmati dinamici.

Ho letto di recente che i delegati possono essere lenti. I delegati nel mio gioco vengono invocati su ogni frame e mi chiedevo se ci può essere un successo in termini di prestazioni da questo?

Aggiornamento:

Ho anche appena trovato questo http://blogs.msdn.com/b/shawnhar/archive/2007/07/09/delegates-events-and-garbage.aspx

Questo è quello che ero preoccupato, e credo che non ci può essere un modo intorno ad esso. Grazie per tutte le altre informazioni.

+0

Scrivi un piccolo microbenchmark e scoprilo da solo? – Brian

+0

Per quanto riguarda il vostro aggiornamento - non ricreare i delegati ogni 1/60 sec. Tuttavia, anche se lo facessi, le istanze sarebbero tutte in Gen0 nell'heap e il GC è _molto efficiente nel raccogliere Gen0. – codekaizen

+0

@codekaizen Tranne che il GC su Xbox non è generazionale! –

risposta

8

Non preoccuparti: i delegati sono leggermente più lenti di una normale chiamata di funzione, ma a meno che tu non li chiami diversi milioni di volte al secondo, dubito fortemente che te ne accorga.

Suggerirei di attenersi ai delegati a meno che non si riveli un collo di bottiglia.

+0

sì, dovrebbero essere chiamati al massimo 60 volte al secondo –

+0

Ci sarà una differenza di microsecondi se è solo 60 volte/secondo. Dubito che noterai molta differenza tra delegati e funzioni se fosse 6000 volte/s. –

+0

@Chris Sì, se è 60 volte al secondo, l'impatto sulle prestazioni sarà del tutto trascurabile. Se i delegati lavorano e mantengono il codice semplice e manutenibile, allora prendilo. – mikera

1

Indipendentemente dal fatto che si può essere un calo di prestazioni, la domanda migliore è se c'è o non c'è è un calo di prestazioni. È necessario misurare le prestazioni dell'applicazione con e senza i delegati per determinare se un qualsiasi colpo di performance è accettabile.

+0

Lo farò e ti farò sapere –

1

Ovviamente c'è un certo successo con un delegato rispetto a una chiamata al metodo diretto, ma con le versioni moderne (leggi: post v1.1) del CLR, è veloce come una chiamata di metodo tramite un'interfaccia.

Ecco una tabella delle misure di Potenza grezzi: http://msdn.microsoft.com/en-us/magazine/cc507639.aspx

Come sempre, si dovrebbe misurare per vedere se le prestazioni sono accettabili per voi. Dato che ho usato delegati in codice critico per le prestazioni (animazione) e problemi non esperti, mi aspetterei che funzionasse bene per te.

+0

Ya quel tavolo aiuta grazie! –

1

Le tue ipotesi (e le nostre ipotesi) non saranno accurate e non corrisponderanno necessariamente alle prestazioni effettive del gioco. L'unico modo per conoscere il successo effettivo sarebbe con almeno un tipo di profilazione. Why measure when you can guess?

Oltre a ottenere una misurazione effettiva della prestazione, considerare: è importante? Se il tuo gioco gira a 60 fps (mi diverto anche a 30 fps su giochi frenetici, e riesco a gestire fino a 20 fps se è più lento, come un gioco a turni) e sei in grado di colpire 300 fps in tempi variabili -step mode, e i delegati ti costano 20 fotogrammi (probabilmente non lo faranno, comunque) ... il tuo gioco può ancora mantenere 60fps in modalità time-step fissa.

1

Risponderemo qui a tutte le risposte degli altri, in quanto i delegati non sono un problema a meno che non siano un problema - i profiler sono tuoi amici.

Una cosa da tenere a mente che potrebbe essere potrebbe essere un problema se si ricreano i delegati ogni frame, nel qual caso, si potrebbe generare eccesso di dati inutili, che ridurrà le prestazioni. Tuttavia, utilizzare strumenti come il profiler CLR per determinare prima se questo è un problema per te.