Ios 奇数SpriteKit帧速率下降-怀疑SKPhysicsBody实例延迟

Ios 奇数SpriteKit帧速率下降-怀疑SKPhysicsBody实例延迟,ios,iphone,swift,sprite-kit,frame-rate,Ios,Iphone,Swift,Sprite Kit,Frame Rate,我正在开发一款小型SpriteKit游戏,该游戏涉及操纵玩家SKSpriteNode通过一系列级联门,这些门生成: 为了防止帧速率随时间下降,我在游戏场景的更新功能中实现了一个简单的代码块: for node in children { if(node.position.y < -100) { if(node.name == "player") { switchMode(2)

我正在开发一款小型SpriteKit游戏,该游戏涉及操纵玩家SKSpriteNode通过一系列级联门,这些门生成:

为了防止帧速率随时间下降,我在游戏场景的更新功能中实现了一个简单的代码块:

        for node in children {
        if(node.position.y < -100) {
            if(node.name == "player") {
                switchMode(2)
            }
            node.removeFromParent()
        }
子节点中节点的
{
if(节点位置y<-100){
如果(node.name==“玩家”){
切换模式(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上测试我的应用程序。

嗯,上次我监控游戏场景的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的帧速率出现奇数下降的人,请关注游戏场景的孩子。计数,这通常可以作为错误来源的指示器您的问题。

如果您正在观看FPS,那么我假设您已将
skView.showsFPS
设置为
YES
。您是否还启用了
.showsDrawCount
.showsNodeCount
?@Thunk,如屏幕截图中所示,.showsFPS和.showsNodeCount已启用,但.showsDrawCount未启用。此外,由SKView只是屏幕上的节点数。我在几天前对子节点进行了一些监视。数了几天之后,似乎SKNodes已成功删除。请原谅,什么是
子节点
?您是否从该阵列中删除节点?如果该阵列不断增加,则可能会由于不得不循环而导致速度减慢每秒检查60次。另一个提高性能的方法是,每隔一秒左右只检查
子对象
(如果需要,可能会更快)。@Gliderman我的错,我忘了澄清。子对象是GameSecene下的SKNode实例,我已设法将数组大小保持在预期的较低水平。