SpriteKit游戏物理滞后

时间:2014-09-20 10:42:26

标签: ios iphone xcode sprite-kit

我一直在研究SpriteKit游戏已有一段时间了,我有一个烦人的问题,我无法摆脱。我不想过多讲这个游戏,但这很简单。我使用SpriteKits物理每秒生成一些从屏幕顶部掉落的对象(SKSpriteNodes),并且玩家正在与它们进行交互。

大部分时间游戏运行完美(恒定60 FPS)。问题是,有时候(可能是每分钟一次或类似的事情),游戏开始滞后一段时间约3-5秒(仍然是60 FPS),然后它再次完美运行(注意:我' m在iPhone 5s上运行游戏)。这似乎是因为物理学,因为如果我在一个物体上添加一个正常的移动动作,它会非常平滑地运行,而受物理影响的节点则会滞后。

我试图删除一些我拥有的粒子和效果,然后重复使用我的物体,但我无法消除滞后现象。我决定创建一个非常简单的测试项目,看看滞后是否会消失,但它仍然存在。这是代码:

#import "GameScene.h"

static const uint32_t groundCategory = 1 << 0;
static const uint32_t objectCategory = 1 << 1;

@implementation GameScene

-(void)didMoveToView:(SKView *)view
{
    // Init
    self.backgroundColor = [UIColor blackColor];
    self.physicsWorld.gravity = CGVectorMake(0.0f, -3.2f);
    self.physicsWorld.contactDelegate = self;

    // Ground
    SKPhysicsBody* ground = [SKPhysicsBody bodyWithEdgeFromPoint:CGPointMake(0, -88) toPoint:CGPointMake(self.size.width, -88)];
    ground.categoryBitMask = groundCategory;
    self.physicsBody = ground;

    // Start game loop
    SKAction* waitAction = [SKAction waitForDuration:1];
    SKAction* sequence = [SKAction sequence:@[[SKAction performSelector:@selector(addObject) onTarget:self], waitAction]];
    SKAction* repeatAction = [SKAction repeatActionForever:sequence];
    [self runAction:repeatAction withKey:@"fallingObjectsAction"];
}

- (void)addObject
{
    SKSpriteNode* newObject = [SKSpriteNode spriteNodeWithColor:[UIColor whiteColor] size:CGSizeMake(88, 88)];
    newObject.name = @"Object";
    newObject.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:newObject.size];
    newObject.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height + newObject.size.height);
    newObject.physicsBody.categoryBitMask = objectCategory;
    newObject.physicsBody.contactTestBitMask = groundCategory;
    newObject.physicsBody.collisionBitMask = 0;

    [self addChild:newObject];
}

- (void)didBeginContact:(SKPhysicsContact *)contact
{
    if ([contact.bodyA.node.name isEqualToString:@"Object"])
        [contact.bodyA.node removeFromParent];
    else if ([contact.bodyB.node.name isEqualToString:@"Object"])
        [contact.bodyB.node removeFromParent];
}

@end

我每秒生成一个对象,让它从屏幕顶部落下。当它撞到地面时,它会被移除。

我使用物理错误还是SpriteKit的错误,它是否滞后?这看起来很奇怪,因为我正在使用iOS 5的iPhone 5s运行一个非常简单的项目。

1 个答案:

答案 0 :(得分:2)

好的,我和物理学一直有同样的问题。问题是尽管CPU使用率低且FPS一致,但对象仍然很紧张。我终于找到了原因。我找到的解决方案是不将physicsWorld.speed设置为1.0;设置为.9999。现在一切顺利。

我希望这会有所帮助。