我有一个问题,只有当主角与任何其他精灵之间发生第一次碰撞时,我的Sprite Kit游戏才会滞后。第一次碰撞发生后,其他所有碰撞都是平滑的,并且以60.0 fps的速度运行。奇怪的是,在第一次碰撞时,fps仅下降到49-51,但实际游戏停滞了半秒钟。这也不是设置滞后的问题,因为无论我等待启动多长时间,这种情况都会发生。有人知道这个问题是什么吗?

-(void)checkForCollisions {

if (_invincible) return;
[self enumerateChildNodesWithName:@"enemy"
                       usingBlock:^(SKNode *node, BOOL *stop){
                           SKSpriteNode *enemy = (SKSpriteNode *)node;
                           CGRect smallerFrame = CGRectInset(enemy.frame, 22, 22);
                           if (CGRectIntersectsRect(smallerFrame, _sloth.frame)) {

                               [enemy removeFromParent];

                               [self runAction:[SKAction playSoundFileNamed:@"eagle.wav" waitForCompletion:NO]];
                               NSString *burstPath =
                               [[NSBundle mainBundle] pathForResource:@"ExplosionParticle" ofType:@"sks"];

                               SKEmitterNode *burstEmitter =
                               [NSKeyedUnarchiver unarchiveObjectWithFile:burstPath];

                               burstEmitter.position = _sloth.position;
                               [self addChild:burstEmitter];

                               [self changeInLives:-1];

                               _invincible = YES;
                               float blinkTimes = 10;
                               float blinkDuration = 3.0;
                               SKAction *blinkAction =
                               [SKAction customActionWithDuration:blinkDuration
                                                      actionBlock:
                                ^(SKNode *node, CGFloat elapsedTime) {
                                    float slice = blinkDuration / blinkTimes;
                                    float remainder = fmodf(elapsedTime, slice);
                                    node.hidden = remainder > slice / 2;
                                }];
                               SKAction *sequence = [SKAction sequence:@[blinkAction, [SKAction runBlock:^{
                                   _sloth.hidden = NO;
                                   _invincible = NO;
                               }]]];
                               [_sloth runAction:sequence];

                           }
                       }];

}

滞后未链接到发射器节点,因为无论何时注释掉游戏,游戏仍然滞后。
让我知道您是否需要任何其他信息。提前致谢!
这是我的仪器跟踪文件的链接:https://www.dropbox.com/sh/xvd1xdti37d76au/ySL4UaHuOS
如果您查看跟踪文件,请注意当时间事件探查器达到118%时发生冲突。

最佳答案

正如Cocos提到的,可能是声音文件的初始加载导致了一个时间延迟。

在您的实现中添加声音操作:

SKAction *eagleSound;

在您的init方法中添加以下内容:
eagleSound = [SKAction playSoundFileNamed:@"eagle.wav" waitForCompletion:NO];

然后,每当需要播放声音时,请使用以下命令:
[self runAction:eagleSound];

关于ios - Sprite Kit设备在第一次碰撞时滞后,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23460530/

10-12 19:59