2012-03-06 11 views
5

Nella mia applicazione ci sono circa 60 campioni sonori. Devo giocare con una precisione elevata nel tempo. 5ms sarà mater. Il suono deve essere riprodotto in risposta alle azioni dell'utente. Quindi non so quale suono suonerà dopo. Ho pensato ad un pre-trattamento abituale di SoundEffectInstance per tutti i suoni. La creazione di SoundEffectInstance richiede tempo e memoria? È una copia completa di SoundEffect in memoria o solo alcune informazioni sul puntatore. Posso migliorare la mia applicazione se precederò SoundEffectInstances? C'è un altro modo per suonare il campione il più presto possibile in XNA?Come riprodurre l'audio il prima possibile?

+0

Avete bisogno di tutti i suoni in qualsiasi momento nell'applicazione o ci sono suoni assegnati per schermi diversi? – Msonic

+0

Pochi set di 60 suoni.L'utente sceglie il set quindi potrebbe essere un qualsiasi suono dal set – xander27

risposta

3

Un SoundEffect contiene i dati della forma d'onda. Utilizza una grande quantità di memoria (per quanto richiede i dati della forma d'onda).

A SoundEffectInstance è un oggetto di piccole dimensioni, contenente dati relativi alla riproduzione (posizione, volume, ecc.) E un handle alla "voce" che è stata assegnata per eseguire la riproduzione.

Quando si utilizza SoundEffect.Play, internamente crea un SoundEffectInstance. Può anche raggruppare queste istanze, quindi non è necessario ricrearle nelle chiamate successive.

Creazione di un SoundEffectInstance richiede un certo tempo e la memoria. Per gli effetti sonori in un gioco che gira a 30 FPS (33ms per frame) la latenza coinvolta dovrebbe essere impercettibile.


Se stai cercando di riprodurre la musica in sequenza mescolando insieme diversi effetti sonori, dove anche 5ms questioni, è necessario implementare il proprio mixer audio utilizzando DynamicSoundEffectInstance. Ciò assicurerà che i suoni siano sincronizzati fino al campione.


se si sta cercando di creare una sorta di tempo reale giocabile "strumento", e si sta cercando di ottenere la latenza di input-to-output fino a 5ms - poi mollare adesso. 5 ms è assurdamente buono e normalmente richiede attrezzature e software specialistici.

Tuttavia, se è necessario ridurre la latenza input-to-output nel modo migliore possibile, è possibile eseguire il polling dell'input più frequentemente rispetto a una volta per frame. E probabilmente dovresti ancora usare DSEI. Non sono sicuro che DSEI abbia una dimensione del buffer di riproduzione configurabile, ma se lo fosse dovresti renderlo il più piccolo possibile senza introdurre l'audio glitch.

2

Quando un utente sceglie un set, è necessario caricare gli effetti sonori in un dizionario, in modo da accedervi sarà più veloce in seguito.

Tuttavia, non è necessario caricare tutti gli effetti sonori, specialmente quelli che non hai bisogno in un determinato schermo o impostare. Inoltre, dovresti scaricare gli effetti sonori di cui non avrai più bisogno.

Ci vuole tempo per caricare gli effetti sonori, a seconda delle dimensioni e la quantità che si desidera caricare. Ti consiglio di creare una schermata di caricamento di base per caricare/scaricare contenuti nel tuo gioco (la maggior parte dei giochi lo fa in questo modo). Caricherete l'effetto sonoro (formato wav suppongo?) In memoria, non solo un puntatore, ecco perché gli effetti sonori devono essere mantenuti corti.

Un effetto audio già caricato verrà riprodotto molto velocemente (il ritardo è impercettibile). Il preloading sarà incrementare le prestazioni dell'applicazione, al costo dell'utilizzo della memoria.

+0

Avrò bisogno di precaricare l'oggetto SoundEffectIstance per ogni suono o solo SoundEffect? – xander27

+1

Io trovo lì [link] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffect.aspx) che ** "Tutti gli oggetti SoundEffectInstance creati da SoundEffect condividono le risorse di memoria "**. Quindi posso creare qualsiasi numero di 'SoundEffectInstance' – xander27

Problemi correlati