ios - SpriteKit - 更改纹理后 FPS 下降

标签 ios iphone objective-c sprite-kit

我试图在动画中更改 SKSpriteNode 的纹理,但我遇到了 FPS 下降问题!它从 60 下降到 30!在设备和模拟器上!节点是一个平行滚动的背景,这里是代码:

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


}

最佳答案

您通过首先将图像创建为 UIImage 来绕过 Sprite Kit 缓存机制。这将从磁盘加载图像,可能每次都是:

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

除此之外,您在操作上做得过头了。再试一次简化版本,只需分配纹理即可获得相同的结果:

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

关于ios - SpriteKit - 更改纹理后 FPS 下降,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22012986/

相关文章:

ios - 选择时更改单元格 View 颜色。并在选择另一个单元格时将其改回

ios - 从 Storyboard 实例化时,未应用 Interface Builder 中定义的样式元素

ios - Swift 添加 HTML 到 UIWebView,表达式太复杂

iphone - 编写带有嵌入式视频的 iPhone 应用程序

ios - 从 UIActivity Controller 中删除保存视频选项

ios - 为什么VerificationController在didReceiveData内部崩溃

iphone - 打开 GL 错误 : Use of undeclared identifier 'gl_FragColor'

objective-c - UIAlertController 在 iOS 9 中不工作

ios - Apple Watch 连接框架

objective-c - 如何在 cocoa touch/xcode 4 中为开发人员加密我的源代码和导出