我有一个问题,只有当主角与任何其他精灵之间发生第一次碰撞时,我的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/