Я уже некоторое время работаю над игрой SpriteKit, и у меня есть досадная проблема, от которой я не могу избавиться. Я не хочу рассказывать слишком много об игре, но это очень просто. Я генерирую несколько объектов (SKSpriteNodes) каждую секунду, которые падают с верхней части экрана, используя физику SpriteKits, и игрок взаимодействует с ними.Опыт игры в игре 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, что она отстает? Кажется странным, потому что у меня работает очень простой проект с использованием iPhone 5 с iOS 8.
Как вы определили, что игра все еще работает со скоростью 60 кадров в секунду, когда она отстает? Вы использовали drawsFPS и другие флаги? Что такое использование ЦП (см. Вкладку XQode Debug Navigator), когда она отстает, а когда нет? – LearnCocos2D
В viewController я установил skView.showsFPS = YES; Использование ЦП (для тестового проекта, на котором я разместил код) 11%, когда он не отстает, и 11%, когда он отстает, поэтому никакой разницы нет. – simon91
звучит как лаг, это что-то еще, например, если вы попытаетесь переместить узлы с поддержкой физики с помощью действий перемещения, это будет противоречить физике. – LearnCocos2D