2014-09-20 95 views
3

我一直在研究SpriteKit遊戲一段時間,我有一個令人討厭的問題,我無法擺脫。我不想多說這個遊戲,但它很簡單。我使用SpriteKits物理每秒生成一些物體(SKSpriteNodes),這些物體是從屏幕頂部掉下來的,玩家正在與它們進行交互。SpriteKit遊戲物理滯後

大部分時間遊戲運行完美(恆定60 FPS)。問題是,有時(也許每分鐘一次或類似的),遊戲開始滯後約3-5秒(仍然在60 FPS),然後它再次運行完美(注意:我正在運行遊戲在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 8的iPhone 5s的非常簡單的項目。

+0

你是如何確定遊戲仍然以60幀/秒的速度運行的呢?你使用drawsFPS和其他標誌嗎?什麼是CPU使用率(請參閱Xcode調試導航器選項卡)何時滯後以及何時不使用? – LearnCocos2D 2014-09-20 11:33:17

+0

在viewController中,我已經設置了skView.showsFPS = YES; CPU使用率(對於我發佈代碼的測試項目)爲11%,不滯後時爲11%,所以沒有差異。 – simon91 2014-09-20 11:41:27

+0

聽起來像滯後是另一回事,例如,如果您嘗試移動物理啓用節點與移動動作,這將與物理衝突 – LearnCocos2D 2014-09-20 19:18:38

回答

2

好吧我一直在物理學中遇到同樣的問題。儘管CPU使用率低且FPS一致,但問題在於對象仍在緊張。我終於明白了爲什麼。我發現的解決方案是不要設置physicsWorld.speed爲1.0;將其設置爲.9999。現在一切運行順利。

我希望這會有所幫助。

+0

即使調試器讀取60 fps,我的遊戲仍然有抖動,這解決了我的問題。我想知道這是否是蘋果公司的一個漏洞?無論哪種方式,你都救了我很多麻煩。 – 2015-11-19 21:30:12

+0

奇怪,看起來像蘋果的bug,我想知道那裏發生了什麼 – 2017-12-26 21:02:08