2012-03-06 21 views
5

W mojej aplikacji znajduje się około 60 próbek dźwiękowych. Muszę grać z dużą dokładnością w czasie. 5ms będzie mater. Dźwięk musi być odtwarzany w odpowiedzi na działania użytkownika. Więc nie wiem, co będzie dalej brzmieć. Wydaje mi się, że głośno uprzedzam SoundEffectInstance dla wszystkich dźwięków. Czy tworzenie SoundEffectInstance zajmuje jakiś czas i pamięć? Czy jest to pełna kopia SoundEffect w pamięci lub tylko niektóre informacje o wskaźnikach. Czy mogę poprawić moją aplikację, jeśli będę starał się poprawić SoundEffectInstances? Czy istnieje jakikolwiek inny sposób na odtwarzanie próbki tak szybko jak to możliwe w XNA?Jak odtwarzać dźwięk jak najszybciej?

+0

Czy potrzebujesz wszystkich dźwięków w dowolnym momencie aplikacji, czy też dźwięki są przypisane do różnych ekranów? – Msonic

+0

Kilka zestawów po 60 dźwięków.Użytkownik wybiera zestaw, może to być dowolny dźwięk z zestawu – xander27

Odpowiedz

3

A SoundEffect zawiera rzeczywiste dane przebiegu. Wymaga dużej ilości pamięci (tyle, ile wymaga danych falowych).

A SoundEffectInstance to mały obiekt zawierający dane o odtwarzaniu (pozycja, głośność itp.) Oraz uchwyt "głosu", który został przydzielony do odtwarzania.

Podczas korzystania z SoundEffect.Play wewnętrznie tworzy on SoundEffectInstance. Może również łączyć te instancje - więc nie musi odtwarzać ich podczas kolejnych wywołań.

Utworzenie SoundEffectInstance zajmuje trochę czasu i pamięci. W przypadku efektów dźwiękowych w grze działającej z szybkością 30 klatek na sekundę (33 ms na klatkę) opóźnienie musi być niedostrzegalne.


Jeśli próbujesz odtwarzać muzykę uporządkowanej przez zmieszanie różnych efektów dźwiękowych, gdzie liczy nawet 5ms, musisz zaimplementować własną mikser audio z wykorzystaniem DynamicSoundEffectInstance. Zapewni to zsynchronizowanie dźwięków z próbką.


Jeśli próbujesz stworzyć jakąś czasie rzeczywistym odtwarzane „instrument”, a ty próbujesz uzyskać opóźnienie wejścia do wyjścia, aż do 5ms - wtedy zrezygnować teraz. 5ms jest absurdalnie dobre i zwykle wymaga specjalistycznego sprzętu i oprogramowania.

Mimo to, jeśli chcesz maksymalnie zmniejszyć opóźnienie wejścia-wyjścia, możesz sondować wejście częściej niż raz na klatkę. I nadal powinieneś prawdopodobnie używać DSEI. Nie jestem pewien, czy DSEI ma konfigurowalny rozmiar bufora odtwarzania, ale jeśli tak, to powinieneś zrobić to tak małe, jak to możliwe, bez wprowadzania usterki audio.

2

Gdy użytkownik wybierze zestaw, należy wczytać te efekty dźwiękowe do słownika, aby uzyskać do nich dostęp później.

Nie należy jednak ładować wszystkich efektów dźwiękowych, szczególnie tych, które nie są potrzebne na określonym ekranie lub w określonym zestawie. Dodatkowo, należy rozładować efekty dźwiękowe, których już nie potrzebujesz.

Załadowanie tych efektów dźwiękowych zajmuje trochę czasu, w zależności od rozmiaru i ilości, które chcesz załadować. Polecam zrobić podstawowy ekran ładowania, aby załadować/wyładować zawartość w grze (większość gier robi to w ten sposób). Będziesz ładował soundeffect (wav format chyba?) W pamięci, a nie tylko wskaźnik, dlatego efekty dźwiękowe muszą być krótkie.

Już załadowany efekt dźwiękowy będzie odtwarzany bardzo szybko (opóźnienie jest niedostrzegalne). Wstępne ładowanie zwiększa wydajność aplikacji, kosztem użycia pamięci.

+0

. Muszę wstępnie wczytać obiekt SoundEffectIstance dla każdego dźwięku lub po prostu SoundEffect? – xander27

+1

Znajduję tam [link] (http://msdn.microsoft.com/en-us/library/microsoft.xna.framework.audio.soundeffect.aspx), który ** "Wszystkie obiekty SoundEffectInstance utworzone z zasobów pamięci dzielenia SoundEffect "**. Mogę więc stworzyć dowolną liczbę 'SoundEffectInstance' – xander27

Powiązane problemy