0

我在我的 iphone 游戏中实现了 OpenAL 代码。当我开始游戏时,它会运行 1 秒并停止 2 秒然后恢复(打嗝效果)。我相信它是由于声音文件加载而延迟的。解决办法是什么?任何人都可以推荐任何书籍、网站或源代码(请不要参考 iPhone)?是否有加载过程,我应该在哪里初始化加载过程?那会有帮助吗?

下面,我已经包含了我已经实现的 OpenAL 代码的相关组件。声音文件将由游戏循环中的“if”语句播放和调用。OpenALController 类用于创建声源和缓冲区,并在OpenALController中调用InitOpenAL方法。MyView 是 UIView 的自定义子类,并连接到主视图(我没有使用默认视图)。

// MyView.m // 一个自定义的 UIView 作为主视图。
#import "OpenALSoundController.h"
- (void)startPlaying{
...
[self initializeValuables];
...
[自初始化定时器];
}
- (void)initializeTimer { if (theTimer == nil) {
theTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector)gameLoop)];
theTimer.frameInterval = 2;
[theTimer addToRunLoop: [NSRunLoop currentRunLoop] forMode: NSDefaultRunLoopMode];
}
}
- (void)gameLoop { ... If something = true // 播放声音 [[OpenALSoundController sharedSoundController] playSound1];
...
}
...
@end


// OpenALSoundController.h @interface OpenALSoundController : NSObject {
...}
...
+ (OpenALSoundController*) sharedSoundController
...
@end


// OpenALSoundController.m
// 单例访问器
{
static OpenALSoundController* shared_sound_controller;
@synchronized(self)
{
if(nil == shared_sound_controller)
{ shared_sound_controller = [[OpenALSoundController alloc] init];
}
返回 shared_sound_controller;
}
返回 shared_sound_controller;
}
- (void) initOpenAL{
...
file_url = [[NSURL alloc] initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"fire" ofType:@"wav"]];
firePcmData = MyGetOpenALAudioDataAll((CFURLRef)file_url, &data_size, &al_format,&sample_rate);
alBufferData(fireOutputBuffer, al_format, firePcmData, data_size, sample_rate);
[file_url 发布];
...
alSourcei(outputSourceFire, AL_BUFFER, fireOutputBuffer);
...
}

4

2 回答 2

0

您可能对Finch感兴趣,这是一个适用于 iOS 的 OpenAL 声音引擎。它非常适合游戏。重用一些已经存在的代码通常比开发和维护自己的代码更好。

于 2010-11-27T10:09:28.490 回答
0

首先最好使用 mp3,因为 wav 文件很大,从磁盘加载需要时间。Mp3 文件在磁​​盘上较小,加载到内存中并在那里解压缩以供播放。尝试通过降低 mp3 比特率/编码质量来进行试验。

此外,您需要预先加载声音以避免打嗝,否则您将在第一次播放声音时有延迟。

于 2011-02-03T10:29:34.263 回答