[XAudio2] Source Voice pro Klang?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8292
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

[XAudio2] Source Voice pro Klang?

Beitrag von Krishty »

Hi,

Ich habe noch nicht viel mit Audioprogrammierung gemacht und befummle hier XAudio2.

XAudio2 nutzt das Prinzip von Voices. Source Voices dekodieren dabei ein Quellmedium (z.B. eine WAV- oder WMA-Datei) und leiten den Klang an die Mastering Voice weiter, wo alle Klänge vermischt und schließlich zur Audio-Hardware geschickt werden.

Nun bin ich ein wenig unsicher, wie viele Source Voices ich erzeugen und wie ich sie verteilen soll.

Sagen wir, ich habe Klangdateien für quietschende Reifen und rauschenden Wind. Rein intuitiv würde ich nun fünf Source Voices anlegen: Vier für je einen quietschenden Reifen, und eine für rauschenden Wind. Wenn ein Reifen zu quietschen beginnt, schalte ich seine Quietsch-Source Voice ein; wenn er aufhört, schalte ich sie ab. Der Wind rauscht die ganze Zeit, nur unterschiedlich laut. Füge ich ein zweites Auto hinzu, bekommt auch das wieder vier Source Voices für quietschende Reifen. Wenn ich das so mache, werde ich am Ende um die hundert Source Voices haben (quasi eine für jede Klangquelle), wovon aber nur rund zehn gleichzeitig aktiv sind.

Das ist für mich sehr einfach, aber benutze ich sie damit richtig? Oder sollte ich lieber (aber leider viel komplizierter) einen Pool von zehn Source Voices anlegen, und die Klangdateien dynamisch zuweisen; je nachdem, welche ich gerade brauche? Ist so ein inflationärer Gebrauch von Source Voices in Ordnung, so lange sie brach liegen (wie bei Texturen in Direct3D)? Oder sind das extrem teure Ressourcen, deren pure Existenz die Maschine ausbremst, und die man unbedingt auf ein Minimum begrenzt nutzen sollte?

Mit verwirrtem Gruß

Nachtrag: Die MSDN erwähnt
IXAudio2::CreateSourceVoice method hat geschrieben:XAudio2 uses an internal memory pooler for voices with the same format. This means memory allocation for voices will occur less frequently as more voices are created and then destroyed. To minimize just-in-time allocations, a title can create the anticipated maximum number of voices needed up front, and then delete them as necessary. Voices will then be reused from the XAudio2 pool.
Das deute ich in die Richtung, dass sie auf inflationären Gebrauch ausgelegt sind …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
ponx
Establishment
Beiträge: 217
Registriert: 04.05.2008, 12:52
Echter Name: Andy Ponx
Wohnort: Hamburg
Kontaktdaten:

Re: [XAudio2] Source Voice pro Klang?

Beitrag von ponx »

hallo Krishty,
also in unserer Musik-Middleware benutze ich die Voices in XAudio2 so, wie man sich einen Kanal am Mischpult vorstellt, also in Sinne von Soundquelle. In unserem Fall weiß ich, mehr als 16 Soundquellen werden gleichzeitig nie erklingen, und bei jedem neuen Klang (in unserem Fall Musikschnipsel) erhöhe ich den Index um 1, lade die neuen Audiodaten in den Puffer der Voice, und spiele dann ab. Weil ich immer erst zur Laufzeit weiß, welcher der theoretisch unendlich vielen Audiodaten als nächstes abgespielt werden, geht's in unserem Fall auch gar nicht anders, also es macht keinen Sinn da irgendwelche Daten im Puffer vorzuhalten. Bei so Sachen, die praktisch permanent im Spiel vorkommen wie Reifenquietschen oder Windrauschen würde ich z.B. 4 Voices für verschiedene Varianten von Windrauschen reservieren, die du dann durchschaltest, also abwechselnd spielst. Jedes Mal eine neue Voice zu erzeugen macht da glaub ich keinen Sinn. Was eher Performance frisst, ist das neue Puffern der Daten, die zu der Voice gehören. Wenn man die im Speicher hält (wegen schnelleren Reaktionszeiten), kann man die Voice auch gleich behalten. Für andere Effekte, die selten abgespielt werden, kannst du die Voice dann theoretisch neu erzeugen und dann wieder löschen. In Kanälen am Mischpult zu denken (und die Voices wiederzuverwenden) find ich zwar irgendwie sauberer, aber macht performance-technisch heutzutage wohl keinen Unterschied mehr, zumal XAudio2 ja laut der API Doku einen vor-allozierten memory pool für die Voices hat.
Also Kurzform: eigene Voice für alles, was so oft im Spiel getriggert wird, dass es Sinn macht, die dazugehörigen Audiodaten im Speicher zu halten. Für alles andere entweder einen Pool von Voices verwenden (Anzahl der voices entspricht der Anzahl der zusätzlichen Soundeffekte, die in deinem Spiel maximal gleichzeitig spielen), der dann der index durchgeschaltet wird und immer neue Audiodaten kriegt. Oder eben Einweg-Voices verwenden, die dann am Ende des Abspielens gelöscht werden.
Benutzeravatar
Krishty
Establishment
Beiträge: 8292
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [XAudio2] Source Voice pro Klang?

Beitrag von Krishty »

Danke, das hilft mir :-)
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten