2011-09-16 12 views
5

Sto cercando un problema di prestazioni nella parte Disegno del mio codice xna per Windows Phone 7 che si verifica a volte dopo alcuni secondi. Esiste una best practice su come/quando chiamare SpriteBatch.Begin per disegnare qualcosa? Dovrebbe essere chiamato per ogni coppia di sprite (in ogni classe quando disegna il giocatore, lo sfondo, gli oggetti di sfondo, ...) o una chiamata all'inizio -> disegna tutto in tutte le sottoclassi - essere migliore per la performance?Con quale frequenza chiamare SpriteBatch.Begin() /. End()?

risposta

2

Non dovresti usarli più del necessario, perché Begin() significa preparare il dispositivo per il rendering sprite e End() significa ripristinare il suo stato precedente. Questo può variare attraverso alcuni flag in Begin() che ti dicono di non voler modificare lo stato, e potrebbe complicare il tuo codice perché dovresti impostare manualmente alcuni stati.

cambiamenti di stato del dispositivo sono spesso lenti e si dovrebbe evitare di fare loro, se non necessari, ma anche possono interferire con qualsiasi cosa si sta facendo, quindi se si vuole rendere qualcosa non in SpriteBatch si dovrebbe chiamare End(), ma se stai rendendo gli sprite che dovresti chiamarlo una volta per tutti gli sprite.

Per evitare di chiamare End() per modificare gli stati che non sono visualizzati nello sprite precedente, è necessario chiamare Flush() anziché End(). Ciò rende gli sprite in coda con le trasformazioni correnti e gli stati del dispositivo, ma lascia gli stati intatti. Che cosa fa la funzione End() è chiamare Flush() e ripristinare determinati stati impostati da Begin().

2

La cosa migliore in termini di prestazioni è chiamare inizio/fine solo una volta per Draw(), questo fa sì che tutti gli sprite di un batch vengano elaborati dalla scheda grafica contemporaneamente. Dovresti utilizzare più batch di sprite solo se necessario. Esempi di quando potrebbe essere necessario sono:

  • si desidera applicare un effetto solo a determinati sprite, ma non altri
  • si vuole prendere uno screenshot
  • si vuole fare qualcosa di più complesso, con effetti

Qualcuno può pensare ad un altro motivo per più lotti di sprite (inizio-> fine)?

+0

L'elenco degli overload per Begin è disponibile qui: http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.graphics.spritebatch.begin.aspx Se desideri qualcosa di diverso, ad esempio come passaggio in un effetto personalizzato o in una diversa matrice di trasformazione, devi fare un'altra chiamata. –

+0

Ciao, non sono in grado di prendere lo screenshot di un'immagine che si trova su uno sprite specifico ma è stato in grado di prendere lo screenshot su un altro sprite. Qualche idea, perché questo potrebbe essere successo? – nagavamsikrishna

+0

@salsabear, sembra il materiale per una nuova domanda. Se includi il codice nella domanda, assicurati di includere solo le parti relent. –