我在我的 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);
...
}