Domanda

Sto sviluppando un'app (Game XNA) per Xbox, che è un'app piuttosto semplice. La Pagina start contiene piastrelle con immagini GIF in movimento. Quelle immagini GIF sono in realtà tutte immagini PNG, che vengono caricate una volta da ogni piastrella e mettono in un array. Quindi, usando un ritardo definito, vengono riprodotte queste immagini (usando un contatore che aumenta ogni volta che passa un ritardo).

Tutto funziona bene, tuttavia, ho notato un piccolo ritardo ogni x secondi nel movimento delle immagini GIF. Ho quindi iniziato ad aggiungere alcune cose di benchmarking:

http://gyazo.com/f5fe0da3ff81bd45c0c52d963feb91d8

Come puoi vedere, l'FPS è piuttosto basso per un programma così semplice (questo è in debug, quando si esegue l'app da Xbox It stesso, ottengo un AVG di 62FP). 2 Impostazioni importanti: grafica.synchronizeWithverticalRetrace = false; IsFixEdTimeStep = false;

Cambiare IsFixEdTimestep in True aumenta il ritardo. La piastrella di impostazioni ha le ruote che ruotano e puoi vedere le ruote tornare un po 'ogni x secondi. Anche gli stessi conteggi per SynchronizeWVR aumentano il ritardo.

Ho notato una connessione tra il ritardo e il momento in cui il collettore della spazzatura entra, ogni volta che entra in gioco, c'è un ritardo ...

Non importa l'HMU MAX (utilizzo della memoria heap), poiché questo prende la quantità di inizio, l'AVG è più realistico.

Ecco un altro schermo del monitor delle prestazioni, tuttavia non capisco molto da questo strumento, la prima volta che lo uso ... spero che aiuti:

http://gyazo.com/f70a3d400657ac61e6e9f2caaaf17587

È stato utile?

Soluzione

Dopo una piccola ricerca ho trovato il colpevole.

Ho componenti personalizzati che derivano tutti da GameComponent e che vengono aggiunti all'elenco dei componenti della classe di gioco principale.

Questo era uno (di un totale di 2) grave problema, causando aggiornare tutto ciò che non aveva bisogno di un aggiornamento. (Il metodo di sorteggio era l'unico a tenere a mente lo stato di pagina e ha disegnato solo se necessario). L'ho risolto usando diversi "schermi" (o pagine come li ho chiamati), che sono gli unici componenti che derivano da GameComponent.

Quindi aggiorno solo la pagina che è attiva e anche i componenti personalizzati in quella pagina vengono aggiornati. Problema risolto.

Il secondo grosso problema è il seguente; Ho fatto una lezione che mi aiuta a posizionare cose sullo schermo, relativo, con percentuali e cose del genere. Contenitori per genitori, allinea e V-ALIGNS ecc. Ecc. Quella classe aveva proprietà, per dimensioni e vettori, ma invece di salvare il valore calcolato in un campo di supporto, li ho ricalcolati ogni volta che ho acceduto a una proprietà. Ma il calcolo di cose complesse come quella utilizza riferimenti (ad esempio ai contenitori per genitori e figli) che lo hanno reso molto difficile per il CLR, perché aveva un sacco di lavoro da fare.

Ora ho ricostruito l'intera classe di posizionamento in una classe ottimizzata completamente funzionale, con bandiere diverse per ricalcolare quando è necessario, e invece di gocce di 20 fps, ora ottengo una media di 170+fps!

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