2011-08-27 15 views
15

Sto scrivendo un gioco utilizzando C# 2010 e XNA 4.0. Voglio che sia un buon gioco e non un "solo un altro schifo" e quindi uno dei miei obiettivi è un buon framerate. Per questo vorrei chiederti alcuni consigli, che si tratti di XNA o di C# correlati: cosa posso fare per accelerare il mio codice e quindi migliorare FPS.Prestazioni del gioco XNA

Ecco alcune cose che ho scoperto:

  • (C#) con array invece di list<> migliorerà le prestazioni molto, nel caso in cui si desidera accedere enorme quantità di dati (o anche lotti: avere una matrice di 20000 elementi ha dato quasi il 180% FPS della lista di 20000.
  • (C#) con for invece di foreach migliorerà le prestazioni. Sulla stessa 20000 elementi è come differenza 5-10%.
  • (XNA e C#) metodi di chiamata costa le prestazioni, quindi quando ho sparpagliato il mio codice in meth ods quello che chiamava altri metodi e così, e tutto era così bello e orientato agli oggetti che era sul costo di 1-3 FPS per ogni chiamata.
  • (xna) aggiornamento vs. draw: non è stata alcuna differenza nelle prestazioni quando ho inserito il codice in update() e draw(), quindi se non ti interessa molto, non devi mettere alcuni metodi sotto update() invece di tenere tutto insieme in draw() nella speranza di un migliore FPS.
  • (xna) non ho idea se sono io o solo 4.0, ma quando carichi un .X con molte trame e mesh piuttosto complesse, ci vuole molto tempo per caricarlo. Ho dovuto scrivere il mio .X loader e mesh/model renderer solo perché XNA ha iniziato a caricare texture per ogni triangolo, indipendentemente dal fatto che la precedente avesse la stessa trama. Anche scrivere il mio contentloader che memorizza nella cache le trame per te non è una soluzione, perché è ancora utilizzato un sacco di volte. Se fai qualcosa di carino e morbido, ti suggerisco di usare la classe drawuserprimitives e non la Model. (nessuna idea se è solo 4.0, o 3.1 ha avuto anche questo problema di prestazioni)
  • (xna ec) #) Cerca di evitare di usare "nuovo" quando si tratta di disegnare. Ho visto un po 'di codice sul web, che cosa era copia/incollava insieme e aveva "basicEffect = new BasicEffect (graphicsDevice);" e tale brutto nel draw(), e ancora peggio: nelle iterazioni all'interno di draw(). Tale ucciderà le prestazioni. Invece di questo, una di queste classi si trova in "gioco" o in una classe statica. Questo vale anche per altri "oggetti temporanei": brutti, ma penso che sia meglio creare qualcosa di globale e usarlo con attenzione per creare un codice simpatico e soffice che renderà il nostro gioco a causa del garbage collector.

Ok, in modo da rendere lunga storia breve, si prega di inviare qualche buon consiglio qui, quindi mi/possiamo fare buone, veloci ed ottimizzati giochi;)

Grazie in anticipo: Zéiksz

+0

Sembra un buon candidato di CW :) – BlackBear

+1

Suggerirei di rendere questo un wiki della comunità. – Ben

+3

Non comprarlo, l'utilizzo di un'architettura OOP solida costa 1-3 fps per ogni chiamata ... – Blindy

risposta

5

UberGeekGames ha un buon articolo sull'ottimizzazione XNA. Si rivolge principalmente a Xbox e WP7, ma molte cose si applicano anche al PC.

http://www.sgtconker.com/2011/05/high-end-performance-optimizations-on-the-xbox-360-and-windows-phone-7/

sito originale è morto, ma è disponibile in Internet Archive:

Archived version of High end performance optimizations on the xbox 360 and windows phone7

La regola generale è "profilo prima di ottimizzazione".

+0

+1 Mi piace il sito, grazie per la condivisione. –

+6

Il sito sembra morto a partire dal 24 AGOSTO 12. – Inisheer

7

L'ottimizzazione del software è un mestiere. I migliori tipi di ottimizzazione sono prove basate sulle statistiche raccolte.

Fino a quando non si verifica un problema, non ottimizzare. Non pensi che la giocabilità del gioco sia più importante di questa metrica o di un'altra? Il mio suggerimento è di rendere il gioco prima e poi considerare dove non sta andando come vorresti.

Quindi postare alcune domande specifiche e sono sicuro che otterrete un aiuto qui sulle questioni specifiche.

Nel frattempo suggerisco di ottenere ulteriori informazioni dai libri di sviluppo giochi come quelli elencati qui: http://forums.create.msdn.com/forums/p/8642/45646.aspx.

XNA Extereme 101 - sembra essere un interessante tutorial

+0

Concordo sul fatto che l'ottimizzazione della pre-programmazione è no-no. Ma penso che avere una domanda/risposta per le persone che si imbattono in questo problema sarebbe utile. –

+0

@erik: anch'io sono d'accordo. È un buon posto per raccogliere queste informazioni. –

+0

+1 Sono completamente d'accordo con questa risposta. Le persone che si imbattono in problemi di prestazioni stanno quasi certamente facendo qualcosa di gravemente sbagliato e dovrebbero eseguire un profiler per trovarlo o pubblicare sul problema specifico. Se hai problemi, unire metà delle tue chiamate al metodo NON ti aiuterà. –

7

I miei 2 centesimi vale la pena:

non mettere tutte il codice in un metodo perché si pensa che costa di chiamare un metodo. Se pensi di perdere 1-3 FPS chiamando un metodo vuoto, probabilmente non hai ancora finito di cercare la perdita 1-3. Affinché tale perdita sia vera durante una chiamata di metodo vuota, dovresti avere un FrameRate in MOLTRE migliaia ... dove non ti preoccuperai di un calo di 1-3.

FPS è un cattivo modo per giudicare le prestazioni in XNA. Quando è abilitato il passaggio del tempo variabile, altri processi con cui il sistema operativo è coinvolto possono influenzare la frequenza dei fotogrammi. Hai davvero bisogno di profilo, invece. Concentrati sulla quantità di tempo che impiega effettivamente per completare l'aggiornamento &/o sui metodi di disegno sincronizzandoli con un oggetto System.Diagnostic.Stopwatch. tempo li individualmente, non insieme (molto importante).

La parola chiave 'new' non deve essere evitata solo nella chiamata di estrazione, ma in qualsiasi punto sia nell'aggiornamento & sia in corso ... FOR solo per i tipi di riferimento. Utilizza la nuova parola chiave in qualsiasi momento e ovunque sia necessario con i tipi di valore.