SpriteKit游戏

时间:2017-01-24 03:52:09

标签: ios objective-c optimization sprite-kit frame-rate

我有一个用SpriteKit构建的游戏,我偶尔也会这样做。当iOS 8仍然是iOS的最新版本时,我开始研究它。那时候,它总是以60fps或几乎(在物理设备上)运行。然而,自从iOS 9开始,现在在iOS 10上,游戏在我的iPhone 5上以12fps的速度运行。它实际上通常在模拟器上运行得更快(13 - 14fps),这是闻所未闻的。

我使用Instruments进行了分析,看起来有些缓慢来自应用程序每帧进行两次枚举。他们在这里:

-(void)moveBackground
{

    [self enumerateChildNodesWithName:@"stars" usingBlock:^(SKNode *node, BOOL *stop)
    {
        SKSpriteNode *bg  = (SKSpriteNode *)node;
        CGPoint bgVelocity = CGPointMake(0, -150); //The speed at which the background image will move
        CGPoint amountToMove = CGPointMultiplyScalar (bgVelocity,0.08);
        bg.position = CGPointAdd(bg.position,amountToMove);
        if (bg.position.y <= 0)
        {
            bg.position = CGPointMake(bg.position.x, bg.position.y + bg.size.height/2);
        }
    }];

    [self enumerateChildNodesWithName:@"opbg" usingBlock:^(SKNode *node, BOOL *stop)
     {
         SKSpriteNode *opbg  = (SKSpriteNode *)node;
         CGPoint bgVelocity = CGPointMake(0, -150); //The speed at which the background image will move
         CGPoint amountToMove = CGPointMultiplyScalar (bgVelocity,0.08);
         opbg.position = CGPointAdd(opbg.position,amountToMove);
         if (opbg.position.y <= 0)
         {
             [self.opbg removeFromParent];
         }
     }];
}

这些枚举会将起始背景移动到屏幕外,然后将其从父项中删除,并在完成后再循环常规背景。有更有效的方法吗?此外,还有另一种优化应用程序而不会失去任何质量的方法吗?我的图像相对较大(背景为1080x3840),但我不确定是否可以使用较小的图像,然后在不损失质量的情况下升级它们。

我们非常感谢提高帧率的任何帮助,如果需要,我可以显示更多代码。

由于

1 个答案:

答案 0 :(得分:2)

iOS 8和9之间的最大变化是添加了一个cameranode:

https://developer.apple.com/reference/spritekit/skcameranode

臭名昭着的性能下降。

苹果论坛上有一连串关于iOS 9性能的投诉。苹果没有及时和令人满意的沟通。由于缺乏有意义的修复和解释,许多SpriteKit用户和潜在用户都丢失了。

在您的情况下,切换到使用相机进行视差可能会恢复一些性能。

以下是有关正在讨论的性能的一些问题,因此您可能会看到是否有人在做类似的事情:

https://forums.developer.apple.com/thread/14487

https://forums.developer.apple.com/thread/30651