我对使用后台线程知之甚少,但这似乎以我需要的方式播放我的声音,如下所示:
1)即使声音重叠,我也需要这个很短的声音效果来反复播放。2)我需要把声音很好地按时播放。3)我需要加载声音不影响屏幕上的图形口吃。
我目前只是尝试这个方法与一个声音,但如果成功,我将推出它的其他声音效果,需要同样的治疗。我的问题是:我是否正确地使用后台线程?会有任何内存泄漏吗?
下面是代码:
-(void) playAudio {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
NSString *path = [NSString stringWithFormat:@"%@/metronome.mp3", [[NSBundle mainBundle] resourcePath]];
NSURL *metronomeSound = [NSURL fileURLWithPath:path];
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:metronomeSound error:nil];
[_audioPlayer prepareToPlay];
[_audioPlayer play];
});
}
//handles collision detection
-(void) didBeginContact:(SKPhysicsContact *)contact {
uint32_t categoryA = contact.bodyA.categoryBitMask;
uint32_t categoryB = contact.bodyB.categoryBitMask;
if (categoryA == kLineCategory || categoryB == kLineCategory) {
NSLog(@"line contact");
[self playAudio];
}
}
发布于 2017-06-22 17:13:43
据我所知,我使用AVAudioPlayer并在后台线程中异步使用它,没有任何问题,也没有泄漏。但是,我已经实现了一个单例类,它处理所有分配,并保留一个AVAudioPlayer实例数组,这些实例也在需要时异步播放。如果需要重复播放声音,则应该为每次播放声音时分配一个AVAudioPlayer实例。在这种情况下,延迟是可以忽略不计的,你甚至可以同时播放相同的声音。
关于你的策略,我认为需要一些改进,特别是如果你想防止任何延误。主要问题总是从磁盘读取,这是最慢的操作和限制步骤。
因此,我还将实现一个AVAudioPlayers数组,每个数组已经初始化,以播放特定的声音,特别是如果这个声音经常重复播放的话。如果内存开始增长,则可以从数组中删除那些播放频率较低的玩家实例,并在几秒钟前重新加载它们,如果您能够判断需要哪些实例的话。
还有一件事。不要忘记锁定和解锁数组,如果您要从多个线程或更好地访问它,请创建一个GCD队列来处理对数组的所有访问。
https://stackoverflow.com/questions/44704573
复制相似问题