2014-02-25 48 views
1

我试图在动画时改变SKSpriteNode的纹理,但是我面临FPS丢弃!它从60下降到30!在设备和模拟器上!节点是并行滚动背景,这里是代码:SpriteKit - 改变纹理后的FPS掉落

- (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]; 

} 

运动背景:

- (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); }} ]; 

} 

更新帧:

- (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]; 


} 
+1

您是否尝试过预加载纹理? – ZeMoon

+0

@akashg不,我应该怎么做? –

+0

如果它是单个纹理,请调用-preloadWithCompletionHandler:就可以了。如果有多个纹理,请将它们从图集中提取出来或放入数组中,并调用+ preloadTextures:withCompletionHandler:on。确保在场景的init方法中执行此操作,并将可以在完成块中删除的加载器放入。 – ZeMoon

回答

1

你绕过雪碧包缓存机制通过首先创建图像作为UIImage。这可能会每次从磁盘加载映像:

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

除此之外,您正在使用该操作进行过度操作。用简单的版本再试一次,只需指定纹理即可得到相同的结果:

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

谢谢,但结果是一样的,如果你检查我的代码我使用:'[bg setTexture:textre];' –

+0

尝试记录,如果它运行(几乎)每一帧或一次运行数十个精灵,将会影响性能。 – LearnCocos2D

+0

但感谢它现在似乎工作正常!它运行时不会丢失FPS! –