我一直在研究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的非常簡單的項目。
你是如何確定遊戲仍然以60幀/秒的速度運行的呢?你使用drawsFPS和其他標誌嗎?什麼是CPU使用率(請參閱Xcode調試導航器選項卡)何時滯後以及何時不使用? – LearnCocos2D 2014-09-20 11:33:17
在viewController中,我已經設置了skView.showsFPS = YES; CPU使用率(對於我發佈代碼的測試項目)爲11%,不滯後時爲11%,所以沒有差異。 – simon91 2014-09-20 11:41:27
聽起來像滯後是另一回事,例如,如果您嘗試移動物理啓用節點與移動動作,這將與物理衝突 – LearnCocos2D 2014-09-20 19:18:38