Sprite Kit设备在第一次碰撞时滞后

时间:2014-05-04 19:21:58

标签: ios opengl-es sprite-kit collision lag

我遇到一个问题,我的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];

                           }
                       }];

}

滞后没有与发射器节点相关联,因为游戏在被注释时仍然滞后。 如果您需要任何其他信息,请与我们联系。提前致谢! 以下是我的Instruments跟踪文件的链接:https://www.dropbox.com/sh/xvd1xdti37d76au/ySL4UaHuOS 如果查看跟踪文件,请注意当Time Profiler达到118%时发生冲突。

1 个答案:

答案 0 :(得分:1)

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

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

SKAction *eagleSound;

在你的init方法中添加:

eagleSound = [SKAction playSoundFileNamed:@"eagle.wav" waitForCompletion:NO];

然后,无论何时需要播放声音,请使用:

[self runAction:eagleSound];