我创建了一个音乐应用程序,当对象与网格边缘碰撞时,该应用程序会播放9种声音之一。这在模拟器上完美无缺,但在第4代设备上并没有完全同步,在iPhone 3g上完全不同步。
由于不同步,我的意思是混响每0.2秒发生一次以匹配网格移动的速度,并且因为混响不是在设备上同时发出声音听起来不正确。另外,从iPhone 3g看你可以看出网格肯定不会每0.2秒重绘一次 - 速度要慢得多。
以下是基本代码:
- (void)startTime {
[musicTimer setFireDate:[NSDate distantFuture]];
musicTimer = [NSTimer scheduledTimerWithTimeInterval: 0.01
target: self
selector: @selector(checkTime)
userInfo: nil
repeats: YES];
}
- (void)checkTime {
float timeSince = [[NSDate date] timeIntervalSinceDate:lastPlayed];
if(timeSince >= 0.2){
[self repositionBlocks];
}
}
- (void)repositionBlocks {
//Check which sounds need to play and call the play function on each of them
//The following line would play the sound if a collision occurred
Sound *sound = [[Sound alloc] init];
[sound play:@"01.wav"];
[sound release];
[self redrawGrid]; //Redraws the grid with the new positions
[lastPlayed release];
lastPlayed = [[NSDate date] retain];
}
这是我的Sound类
中的播放功能- (void)play:(NSString *)soundFile {
NSString *path;
NSString *fileName = [NSString stringWithFormat:@"/%@", soundFile];
path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle] resourcePath], fileName];
SystemSoundID soundID;
NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID);
AudioServicesPlaySystemSound(soundID);
[filePath release];
}
如果有人可以对此问题提供任何帮助,我将非常感激
由于
编辑:我做了一些测试并将其缩小到NSTimer的问题,在模拟器上它每0.2秒触发一次,但在设备上它每0.4到0.6秒触发一次。我在互联网上搜索过,有很多关于NSTimers不准确的信息,不应该用于此,但我找不到任何替代方案。
答案 0 :(得分:0)
使用CADisplayLink设置帧率;它比使用NSTimer更准确。
您也可以尝试使用AVAudioPlayer缓存您的声音 - 在加载应用或屏幕时,在每个缓存的声音上调用prepareToPlay,然后当您稍后调用播放时,它应该立即播放,没有延迟。 AVAudioPlayer处理缓存声音或从存储中传输它们等。