對於我的小遊戲,我想爲各種場景播放效果音效。
大多數情況下,它將與用戶交互相關。(iphone)有很多AVAudioPlayer實例很好嗎?
我可能需要一次播放多個聲音。
我打算爲每個聲音分配AVAudioPlayer。
我不知道有一個約10-20 AVAudioPlayers viewController是好的。
(聲音數據本身相當小,在aac中小於100k)
我只是覺得在類中聲明10-20 AVAudioPlayer實例似乎很奇怪。
有沒有更好的做法或者我只是過度思考呢?
對於我的小遊戲,我想爲各種場景播放效果音效。
大多數情況下,它將與用戶交互相關。(iphone)有很多AVAudioPlayer實例很好嗎?
我可能需要一次播放多個聲音。
我打算爲每個聲音分配AVAudioPlayer。
我不知道有一個約10-20 AVAudioPlayers viewController是好的。
(聲音數據本身相當小,在aac中小於100k)
我只是覺得在類中聲明10-20 AVAudioPlayer實例似乎很奇怪。
有沒有更好的做法或者我只是過度思考呢?
我認爲在這種情況下OpenAL是一個更好的選擇。如果你不知道的話,別擔心。這裏有一個很大的視頻教程(源代碼):http://www.71squared.com/2009/05/iphone-game-programming-tutorial-9-sound-manager/
要了解更多,您可以訪問: http://benbritten.com/2008/11/06/openal-sound-on-the-iphone/comment-page-1/
是的,這是罰款,有很多AVAudioPlayer
實例。我不知道有多少限制,但肯定超過了一打。
下面是一些陷阱:
AVAudioPlayer
不做級混合,所以如果你的聲音是大批量的,他們可能會彼此並造成波形失真建設性的干擾。我設置了0.8的最大音量來嘗試解決這個問題,但它不可靠。
如果您嘗試同時啓動它們,則使用play
方法可能最終導致它們不同步。相反,應儘快弄清楚用戶不會注意到的時間,但要足夠遠,以便讓代碼有時間退出並準備好時間。然後使用[player playAtTime:soon]
。
下面是一些現在適用於我的代碼。因人而異:
-(void)play
{
BOOL success;
AVAudioPlayer *player = self.player;
player.numberOfLoops = -1;
player.currentTime = 0;
player.volume = _volume;
// NSLog(@"deviceCurrentTime=%f", player.deviceCurrentTime);
static double soon = 0;
if (soon < player.deviceCurrentTime) {
soon = player.deviceCurrentTime + 0.5; // why so flakey???
}
success = [player playAtTime:soon]; // too flakey for now
if (!success) {
NSLog(@"player %@ FAILED", player);
} else {
NSLog(@"player %@ %@ playing at: %f", player, [[player.url relativePath] lastPathComponent], soon);
}
}
(我不知道如果我的「soon
」變種是線程安全的,直到它爲你工作,你應該調整污... 0.1
太快了,我在某些時候或其他所以我把它撞到了0.5
。)