Domanda

Non ho programmato giochi per circa 10 anni (la Mia ultima esperienza è stata DJGPP + Allegro), ma ho pensato di controllare XNA nel fine settimana per vedere come si sviluppava.

Io sono abbastanza impressionato, però, come ho continuare a rimettere insieme i pezzi di un motore di gioco, ho una (probabilmente) domanda di base.

Quanto si dovrebbe fare affidamento su C#'s Delegati ed Eventi a guidare il gioco?Come un programmatore di applicazioni, io uso i delegati e gli eventi pesantemente, ma non so se c'è un sovraccarico di farlo.

Nel mio motore di gioco, ho progettato un "chase cam" di sorta, che può essere collegato a un oggetto e poi ricalcola la sua posizione relativa all'oggetto.Quando l'oggetto si muove, ci sono due modi per aggiornare il chase cam.

  • Sono un "UpdateCameras()" metodo principale ciclo di gioco.
  • Utilizzare un gestore di evento, e hanno la chase cam sottoscrivere oggetto.OnMoved.

Sto usando l'ultima, perché mi permette di catena di eventi insieme e ben automatizzare le grandi parti del motore.Improvvisamente, quello che sarebbe enorme e complesso di farlo cadere in una manciata di 3-5 linea di gestori di eventi...la Sua bellezza.

Tuttavia, se i gestori di eventi di cottura ogni nanosecondo rivelarsi un importante rallentamento, vado a rimuovere e con il loop.

Idee?

È stato utile?

Soluzione

Se si dovesse pensare a un evento come un elenco di sottoscrittori, nel codice tutti si stanno facendo è la registrazione di un sottoscrittore.Il numero di istruzioni necessarie per realizzare che è probabile che sia minimale CLR livello.

Se volete che il vostro codice sia generico o dinamico, quindi hai bisogno di controllare se qualcosa è sottoscritto prima di chiamare un evento.L'evento/delegato meccanismo di C# e .NET fornisce questo a costi molto poco (in termini di CPU).

Se siete davvero preoccupati per ogni ciclo di clock, non si può mai scrivere generico/dinamico gioco di logica.Si tratta di un trade off tra mantenibile/configurabile codice e la vera e propria velocità.

Scritto bene, mi piacerebbe favore di eventi/delegati fino a quando ho potuto provarlo è un problema.

L'unico modo per conoscere davvero se è un problema per te è il profiling del codice, che si dovrebbe fare in ogni caso per qualsiasi sviluppo del gioco!

Altri suggerimenti

È importante rendersi conto che gli eventi in C# non sono in coda di eventi asincroni (come, per esempio, la coda di messaggi Windows).Essi sono essenzialmente una lista di puntatori a funzione.Così la generazione di un evento non peggiori implicazioni in termini di prestazioni rispetto a scorrere un elenco di puntatori a funzione, e chiamando ciascuno.

Allo stesso tempo, rendersi conto che a causa di questo, gli eventi sono sincroni.Se il vostro evento ascoltatore è lento, si rallenterà la classe alzando eventi.

La questione principale sembra essere:"Che cosa è l'overhead associato con l'utilizzo di C# Delegati e gli Eventi?"

Gli eventi sono po ' un overhead significativo in confronto ad una normale chiamata di funzione.

L'uso di Delegati possono creare implicita, e quindi nascosto spazzatura.Spazzatura può essere una delle principali cause di problemi di prestazioni soprattutto su XBox360.

Il codice seguente genera circa 2000 byte di spazzatura al secondo (60 fps) in forma di EntityVisitor oggetti:

    private delegate void SpacialItemVisitor(ISpacialItem item);

    protected override void Update(GameTime gameTime)
    {
        m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects);
    }

    private void ApplyExplosionEffects(ISpacialItem item)
    {
    }

Come lungo come evitare la generazione di rifiuti, i delegati sono abbastanza veloce per la maggior parte degli scopi.A causa dei pericoli nascosti, preferisco evitare di loro e utilizzare le interfacce invece.

Nel mio extra di tempo lontano dal lavoro vero e proprio, ho imparato XNA troppo.

IMHO (o non così umile se chiedete ai miei colleghi) è che il sovraccarico di handle di evento saranno sopraffatti da altri elementi del gioco come il rendering.Dato l'uso pesante di eventi normali .Netto di programmazione sarei il codice sottostante è ben ottimizzato.

Per essere onesti, penso di andare a un UpdateCameras metodo potrebbe essere prematuro di ottimizzazione.Il sistema di eventi che probabilmente ha più a usi diversi dalla fotocamera.

XNA incoraggia l'uso di interfacce, eventi e delegati di guidare qualcosa di scritto con esso.Date un'occhiata al GameComponent relative classi di quale set up per te.

La risposta è, "Come ti senti a tuo agio".

Per elaborare un po', Se per esempio si prende e ereditate dal gamecomponent classe in un cameracontroller di classe e di aggiungere al Gioco.Componente di raccolta.Quindi è possibile creare la vostra fotocamera classi e aggiungerli al tuo cameracontroller.

Facendo questo farà sì che il cameracontroller di essere chiamato regolarmente ed essere in grado di selezionare e attivare la macchina fotografica o più telecamere, se questo è ciò che si sta andando per.

Qui è un esempio di questo (Tutti i suoi tutorial sono di ottimi):ReoCode

Per inciso, si potrebbe essere interessati a sapere che Shawn Hargreaves, sviluppatore originale di Allegro, è uno dei principali sviluppatori su XNA squadra :-)

Prima di andare in quello che è l'impatto di un evento in termini di prestazioni, è necessario prima valutare se sia o non è necessario.

Supponendo che si sta veramente cercando di mantenere un chase cam aggiornato e non è solo un esempio, ciò che si sta cercando non è un evento (anche se gli eventi potrebbe fare il trucco altrettanto bene), se si sta seguendo un avatar probabilità che si sarà in movimento la maggior parte del tempo.

Un approccio che ho trovato estremamente efficace è quello di utilizzare gerarchica, trasformazioni, se si implementa questa in modo efficiente la macchina fotografica non essere l'unico oggetto di beneficiare di un tale sistema, l'obiettivo sarebbe quello di mantenere la fotocamera all'interno di spazio delle coordinate dell'oggetto di monitoraggio.

Tale approccio non è il massimo se si desidera applicare un po 'di elasticità per la velocità e il modo in cui la telecamera segue l'oggetto, per questo, è meglio utilizzare una chiamata di aggiornamento, un riferimento, e un po' di accelerazione e resistenza fisica.

Gli eventi sono più utili per le cose che accadono solo saltuariamente o che riguardano i diversi aspetti dell'applicazione, come un personaggio di morire, probabilmente molti sistemi diversi, vorrebbe essere a conoscenza di tale evento, uccidere le statistiche, il controllo AI, e così via, in tal caso, tenendo traccia di tutti gli oggetti devono costantemente verificare se questo è successo è molto meno efficaci di lancio di un evento e di avere tutti gli interessati oggetti ricevere una notifica solo quando capita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top