我一直在研究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运行一个非常简单的项目。
答案 0 :(得分:2)
好的,我和物理学一直有同样的问题。问题是尽管CPU使用率低且FPS一致,但对象仍然很紧张。我终于找到了原因。我找到的解决方案是不将physicsWorld.speed设置为1.0;设置为.9999。现在一切顺利。
我希望这会有所帮助。