Pregunta

Estoy tratando de cambiar la textura de una skspritenode mientras está animada, ¡pero me enfrenté a FPS cayendo!¡Baja de 60 a 30!¡En ambos dispositivos y simuladores!El nodo es un fondo de desplazamiento paralelo, y aquí están los códigos:

- (void)createBricksEdge {

    brickEdges = [[SKSpriteNode alloc]initWithImageNamed:@"edge.png"];
    brickEdges.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame));;
    brickEdges.name = @"edge";
    [self addChild:brickEdges];

    bEdge1 = [[SKSpriteNode alloc]initWithImageNamed:@"edge.png"];
    bEdge1.position = CGPointMake(brickEdges.position.x,brickEdges.position.y+(brickEdges.size.height));
    bEdge1.name = @"edge";
    [self addChild:bEdge1];

}

Fondo en movimiento:

- (void)moveBg
{

    [self enumerateChildNodesWithName:@"edge" usingBlock: ^(SKNode *node, BOOL *stop)
     {
         SKSpriteNode * bg = (SKSpriteNode *) node;


         if (isSpeedBonus == YES) {

             SPEED = 200;

            } else {


                 switch (speedCriteria) {

                     case 0:
                         SPEED = 7.0;


                        break;

                     case 1:
                        SPEED = 11;


                         NSLog(@"FPS drops");

                         [bg runAction:[SKAction setTexture:[SKTexture textureWithImage:[UIImage imageNamed:@"edgeSpeed.png"]]]];

         //I also tried : [bg setTexture:textre];

                         break;

.
.
.
.
.
                }

            }


         bg.position = CGPointMake(bg.position.x , bg.position.y - SPEED);
         if (bg.position.y <= -bg.size.width)
         { bg.position = CGPointMake(bg.position.x ,bg.position.y + bg.size.height*2); }}   ];

}

Actualización de marcos:

- (void)speedOMeter
{


    int i = (int)[scoreLabel.text integerValue];

    if (i <= 1000) {

        speedCriteria = 0;

    } else if (i <= 1500) {

        speedCriteria = 1;

    } else if (i <=2000) {

        speedCriteria = 2;

    } else if (i <= 2500) {
.
.
.
.

}



- (void)update:(CFTimeInterval)currentTime {

    if (_lastUpdateTime)
    {
        _dt = currentTime - _lastUpdateTime;

    }

    else

    {

        _dt = 0;

    }

    _lastUpdateTime = currentTime;
    [self moveBg]; [self speedOMeter]; 


}

¿Fue útil?

Solución

Usted está omitiendo a los mecanismos de almacenamiento en caché de kit Sprite creando la imagen primero como un UIIMAGE.Esto cargará la imagen del disco, posiblemente cada vez:

[bg runAction:[SKAction setTexture:[SKTexture textureWithImage:[UIImage imageNamed:@"edgeSpeed.png"]]]];

Además de que lo estás exagerando con la acción.Intente nuevamente con la versión simplificada que le dará el mismo resultado simplemente asignando la textura:

bg.texture = [SKTexture textureWithImageNamed:@"edgeSpeed.png"];

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top