奇怪的SpriteKit帧速率下降 - 怀疑挥之不去的SKPhysicsBody实例

时间:2015-10-24 17:20:38

标签: ios iphone swift sprite-kit frame-rate

我正在制作一款小型SpriteKit游戏,游戏涉及通过生成的级联系列门控机制SKSpriteNode:

Screenshot from an iPhone 5c

为了阻止帧速率随着时间的推移而下降,我实现了一个简单的代码块,该代码块包含在我的GameScene更新功能中:

        for node in children {
        if(node.position.y < -100) {
            if(node.name == "player") {
                switchMode(2)
            }
            node.removeFromParent()
        }

游戏以完美的60 fps开始,并在该状态下保持几分钟。

出乎意料的是,在iPhone 5c上游戏运行2-3分钟后出现帧速率下降,4分钟后游戏降至无法播放的12 fps。看看我的代码,在更新循环中随着时间的推移没有发生太多其他事情,所以这种行为很奇怪。有趣的是,当游戏丢失且GUI上的游戏被调用时,帧速率恢复到60 fps,但根据游戏运行的时间长度回落到较慢的FPS。

我怀疑障碍的SKNodes在某种程度上没有被正确删除,也许连接到门SKSpriteNode实例的SKPhysicsBody实例仍处于活动状态并使CPU紧张。我是否可以/需要做些什么来显式删除SKSpriteNode实例的.physicsBody属性以从物理计算中删除它们?我已经尝试在删除期间设置.physicsBody = nil,这没有帮助。

我在OS X 10.11.1上运行Xcode 7.1,在运行iOS 9的iPhone 5c上测试我的应用程序。

1 个答案:

答案 0 :(得分:1)

嗯,上次我监视GameScene的children.count我必须没有监视足够长的时间。与我认为的确认相反,children.count慢慢攀升,尽管每次更新都没有增加。我怀疑有些门没有正确生成,并没有通过屏幕掉下来。我查看了我的源代码,发现了这个烂摊子:

 func genObstacle(rift: Int, x: CGFloat, width: CGFloat) {
    if(width > 0) {
        let obstacle = SKSpriteNode(color: obstacleColor(rift), size: CGSize(width: frame.width * width / 12, height: frame.width / 12))
        obstacle.position = CGPoint(x: frame.width * (x + width / 2) / 12, y: frame.height * 9 / 8)
        obstacle.position.x += (CGFloat)(rift - activeRift) * 2048
        obstacle.physicsBody = SKPhysicsBody(rectangleOfSize: obstacle.size)
        obstacle.physicsBody?.velocity = CGVector(dx: 0, dy: (CGFloat)(-500 - rift * 300) * (frame.height / 500))
        obstacle.physicsBody?.affectedByGravity = false
        obstacle.physicsBody?.allowsRotation = false
        obstacle.physicsBody?.linearDamping = 0
        obstacle.physicsBody?.mass = 32767
        obstacle.name = "obs"
        addChild(obstacle)
    }
}

随机生成使用随机整数(铸造到浮点数)来确定门板应该有多少“单位”宽。我不小心留下了宽度为0的可能性,这造成了错误的SKNodes,它们挥之不去,使物理变得复杂。对于使用SpriteKit,奇怪的帧速率下降的任何其他人,密切注意你的GameScene的children.count ,这通常可以指示你的问题来源。