FPS在SpriteKit中下降

时间:2016-08-19 22:41:03

标签: ios swift sprite-kit

我正在使用Swift& amp; SpriteKit,我注意到FPS从60降到58-59(以及后退)。发生丢弃时会出现明显的延迟 - 看起来像丢弃了1或2帧。

CPU负载大约为20-25%,并且变化不大,内存使用量永久约为8 MB。

截图: App Screenshot

屏幕上有6个对象:标签,红色对象(Sprite),2x绿色对象(Sprite),一个框(Sprite)和" ground" (矩形节点)。

除标签外的所有对象都有物理主体(以白色边框显示)。

绿色和白色物体是动态创建的,从右向左移动并在屏幕外时被破坏:

func scheduleAddingLiquid() {
let wait = SKAction.waitForDuration(NSTimeInterval(getRandomNumber(1, end: 3)))
        let block = SKAction.runBlock({
            [unowned self] in

            let liquidNode = LiquidNode(texture: self.liquidTexture, sceneFrame: self.frame)
            self.addChild(liquidNode)
            liquidNode.move()

            self.scheduleAddingLiquid()
        })

        let sequence = SKAction.sequence([wait, block])
        runAction(sequence)

func move() {
        let moveAction = SKAction.moveToX(-frame.width, duration: NSTimeInterval(3))
        let removeBlock = SKAction.runBlock({
            [unowned self] in

            self.removeFromParent()
            })

        runAction(SKAction.sequence([moveAction, removeBlock]))
    }

红色物体"跳跃"在屏幕上触摸:

if touches.count > 0 && isHeroOnGround && heroNode != nil {
            isHeroOnGround = false
            heroNode.physicsBody?.velocity = CGVector(dx: 0, dy: 0)
            heroNode.physicsBody?.applyImpulse(CGVector(dx: 0, dy: 400))
        }

延迟发生在"跳跃"之后的随机时间间隔内。 (跳跃后约0.5至1.5秒)。

当发生碰撞时,不会发生滞后,只是当红色物体在空中时#34;。并不是每次跳跃都会发生。当FPS下降时,CPU负载不会增长。

在iOS 9.3,iPad mini 2上测试。

更新1.在iOS 9.3 iPhone 6上测试 - FPS在前几秒内大约为50-55,然后它总是60,没有滞后。所以,它只落后于iPad mini 2(我只有这两款设备,不能在其他设备上测试)。

UPD 2。我已注释掉除红色图外的所有对象创建代码。当"跳跃"时它仍然落后。所以,现在我确定它与applyImpulse方法有关。

UPD 3。这真的非常奇怪:我已经从touchesBegan方法中删除了所有代码,但它仍然落后于触摸!该方法完全是空的。我不知道为什么,但如果我点击几次,FPS就会下降......

如何调试?

2 个答案:

答案 0 :(得分:4)

只有mini上的问题让我觉得你的迷你(或迷你的特定包装)有问题。尝试制作一个新项目,复制文件,然后再次运行。另外,你说9.3,但有9.3.1,9.3.2等。这两个设备可能有不同的构建。

所以,首先,确保您的iphone和iPad运行相同版本的iOS ..也许有一个错误,或者他们修补了一个错误(从而导致一个工作而不是另一个)。

另外,尝试在不同的模拟器上运行它...如果它在模拟器上运行完美,那么我更加怀疑迷你(在它的当前配置中)。

通过这种方式,您还可以看到(可能)问题是否与方向有关(iphone与4:3的宽屏或iPad的任何一种)。

有时,我已经非常奇怪"事情发生在我的项目文件中(即使没有插件),只是创建一个新项目,复制所有文件固定它。如果你点击一个空的" touchesBegan" ...让我觉得Xcode /你的mini有些东西在手边 - 因为它只发生在那个设备上(因此我们知道到目前为止)......

需要考虑的其他事项,

  1. 您使用的是哪个版本的Xcode?试试最新的测试版/回到7.3。有什么不同吗?

  2. 您是否有另一台可以尝试构建项目的计算机?

  3. 如果换出[unowned self]或将其留在未修复的内容中,那么我的建议是使用print语句加载您的代码并查看'继续。

  4. 如果您使用场景编辑器制作精灵节点,请将它们全部删除并重新制作,或尝试以编程方式制作。这修复了我的一些项目中的随机错误(似乎没有理由)。

  5. 我们需要更多代码/信息,但上述内容应该可以解决您的问题。

答案 1 :(得分:2)

嗯,我认为它有点晚了,但是当我向场景添加一些SKShapeNode时,性能下降了。我没有200 +普通SKSpriteNode的滞后,当80个节点中只有大约30个SKShapeNode时,一切都开始冻结。当然没有其他功能,只有路径,笔触/填充颜色和lineWidth