Sprite kit SpriteKit&x2B;接触中的AVAudioPlayer移动:杀死fps

Sprite kit SpriteKit&x2B;接触中的AVAudioPlayer移动:杀死fps,sprite-kit,avaudioplayer,frame-rate,Sprite Kit,Avaudioplayer,Frame Rate,在SpriteKit应用程序中,当用户在屏幕上移动一个块时,我会播放一种咔嗒声,但这会导致严重滞后(fps降至接近零) 代码: •self.audioPlayers是一个强大的NSMutableArray,它保存当前正在播放的AVAudioPlayers,并在调用audioplayerddinishplaying:委托方法时将其删除 •blockshouldlmove方法将触摸位置与其以前的位置进行比较,只有当用户移动光标足够远时,才会返回YES,这样我们最多只能同时播放8种声音 - (void

在SpriteKit应用程序中,当用户在屏幕上移动一个块时,我会播放一种咔嗒声,但这会导致严重滞后(fps降至接近零)

代码:

self.audioPlayers
是一个强大的NSMutableArray,它保存当前正在播放的
AVAudioPlayer
s,并在调用
audioplayerddinishplaying:
委托方法时将其删除

blockshouldlmove
方法将触摸位置与其以前的位置进行比较,只有当用户移动光标足够远时,才会返回YES,这样我们最多只能同时播放8种声音

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *oneTouch = [touches anyObject];
    CGPoint location = [oneTouch locationInNode:self];

    if (![self blockShouldMove:location]) {
        return;
    }

    NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"click_01.mp3" ofType:nil];
    AVAudioPlayer *audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:soundFilePath] error:nil];
    [audioPlayer prepareToPlay];
    audioPlayer.volume = 1.0;
    audioPlayer.numberOfLoops = 0;
    audioPlayer.delegate = self;
    [audioPlayer play];
    [self.audioPlayers addObject:audioPlayer];
}
在模拟器和真实设备(iOS和tvOS)上,如果我用手指画圆圈,fps几乎为零,直到我松开手指

如果我删除整个
AVAudioPlayer
并使用
[SKAction playSoundFileNamed:@“click_01.mp3”waitForCompletion:NO]
,一切正常。但不幸的是,
SKAction
声音处理对我来说很糟糕,因为无法设置音量


有什么办法可以让它变得更好吗?

这是一种间接的“回答”,更多的是一种评论,但用那种形式写太长了

我在一款SpriteKit游戏中遇到了类似的问题。我通过删除
AVAudioPlayer
s解决了这个问题,而是使用了场景的音频引擎。我将一组
AVAudioPlayerNode
s连接到主混音器节点,并开始播放(无)。每当我想要某种音效时,我都会抓取下一个音频播放器节点(循环播放方式,并且有足够多的节点,因此我确信它将处于空闲状态),并为它安排一个预加载的声音缓冲区

关键是,对于SpriteKit中更复杂的音频,您可能需要通过音频引擎构建一个适合您想要做的事情的声音图。同时存在的多个
AVAudioPlayer
s似乎以某种方式相互踩在一起并导致延迟

但是,如果您还没有尝试
SKAudioNode
功能,我建议您先尝试一下。您应该能够在音频节点上运行操作以调整音量。我没有走这条路,因为我无法让立体声摇摄以我想要的方式进行设置。如果你想这样做,那可能比设置你自己的声音图表要简单

如果你想看到我最终使用的解决方案,你可以看看