Я создал музыкальное приложение, которое воспроизводит один из 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 не точны и не должны использоваться для этого, но я не могу найти какую-либо альтернативу.