SpriteKit juego de física rezagada

He estado trabajando en un juego SpriteKit por un time y tengo un problema molesto del que no puedo deshacerme. No quiero contar demasiado sobre el juego, pero es muy simple. Genero algunos objects (SKSpriteNodes) cada segundo que caen desde la parte superior de la pantalla usando la física de SpriteKits y el jugador interactúa con ellos.

La mayoría de las veces el juego funciona perfectamente (constante 60 FPS). El problema es que a veces (tal vez una vez por minuto o algo así), el juego comienza a retrasarse un poco durante unos 3-5 segundos (todavía a 60 FPS) y luego vuelve a funcionar perfectamente (nota: estoy ejecutando el juego en un iPhone 5s). Parece ser debido a la física, porque si agrego una acción de movimiento normal a un object, se ejecuta de manera muy suave mientras los nodos afectados por la física están rezagados.

Traté de eliminar algunas partículas y efectos que tengo y reutilizo mis objects, pero no puedo eliminar el retraso. Decidí crear un proyecto de testing muy simple para ver si el retraso se hubiera ido pero todavía está allí. Aquí está el código:

#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 

Genero un object por segundo y lo dejo caer desde la parte superior de la pantalla. Cuando golpea el suelo, se elimina.

¿Estoy usando la física mal o es culpa de SpriteKit que se está retrasando? Parece extraño, porque estoy ejecutando un proyecto muy simple con un iPhone 5s con iOS 8.

Está bien, he estado teniendo el mismo problema con la física. El problema fue que los objects están nerviosos a pesar del bajo uso de la CPU y un FPS consistente. Finalmente he descubierto por qué. La solución que encontré es no configurar physicsWorld.speed a 1.0; establézcalo en un .9999. Ahora todo funciona sin problemas.

Espero que esto ayude.