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 dilist<>
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 diforeach
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 laModel
. (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
Sembra un buon candidato di CW :) – BlackBear
Suggerirei di rendere questo un wiki della comunità. – Ben
Non comprarlo, l'utilizzo di un'architettura OOP solida costa 1-3 fps per ogni chiamata ... – Blindy