2011-12-25 56 views
2

我有一些遊戲聲音,比如四種不同的嘟嘟聲,每一種都是根據用戶的動作進行播放的。我是否需要實例化四個不同的AVAudioPlayer對象?每個人的聲音是否都需要AVAudioPlayer的實例?

或者我只需要一個主播放器?如果我只需要一個,那我該如何切換文件的URL?

這就是我現在所做的:

NSError *error; 
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error]; 

,但它似乎需要幾秒鐘進行初始化。有沒有辦法預加載文件並快速切換它們?

回答

2

繼續創建與聲音一樣多的實例。
初始化後,使用方法prepareToPlay

堆載預壓其緩衝區準備用於播放的音頻播放器。 討論調用此方法可預載緩衝區並獲取播放所需的音頻硬件,從而最大限度地減少調用 play方法與聲音輸出開始之間的延遲。

調用stop方法,或者讓聲音完成播放,請取消 此設置。

例如:

NSError *error; 
soundPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:markedSound error:&error]; 
[soundPlayer prepareToPlay]; 

對於時刻,你只需要4首歌曲,因此這將是過早的優化。但是如果以後,你需要的聲音數量會增加很多,你可以把所有這些包裝在一個子類中,並進行延遲加載。正如文檔所述,使用stop方法相當於卸載文件。

-1

你不一定需要實例四種不同AVAudioPlayer對象,儘管這是一個選項(這可能是最簡單的,如果你只有四個聲音)。

一個你可以使將聲音加載到存儲器中,您可以通過使用initWithData方法,而不是initWithContentsOfURL做(已加載的所有聲音文件提前NSData對象)。這可能會稍微加快速度,但它也取決於您的聲音格式。例如,未壓縮的文件顯然會比MP3加載得快得多。

如果這仍然不適合你,你最好的選擇就是看一些較低級別的音頻技術,它們更適合於遊戲工作(OpenAL,Audio Toolbox等),但是這些比簡單的AVVAudioPlayer複雜一點。

+0

解決方案並非真正最佳。我沒有檢查,但如果大部分延遲來自AVAudioPlayer的工作(解壓縮...)而不是文件加載,我不會感到驚訝。而較低的槓桿解決方案可以很好,但在這種情況下有點矯枉過正。 – Guillaume 2011-12-28 16:18:39

+0

好吧,就像我說的,如果你使用未壓縮的文件,它會更快。 – lxt 2011-12-28 17:43:30

相關問題