Ios Spritekit-动态添加子项会降低性能

Ios Spritekit-动态添加子项会降低性能,ios,objective-c,swift,sprite-kit,frame-rate,Ios,Objective C,Swift,Sprite Kit,Frame Rate,我想知道如何优化我的游戏。我有很多炮塔等发射物理物体。游戏是可玩的,但可以降低到50或45 fps。我发现这与动态地向我的场景添加对象有关 比如说。当我的炮塔射击时,它运行这个代码 func shootBlaster(){ let blaster = Projectile(color: SKColor.cyanColor(), size: CGSize(width: convertNum(3), height: convertNum(3))) blaster.name = "bl

我想知道如何优化我的游戏。我有很多炮塔等发射物理物体。游戏是可玩的,但可以降低到50或45 fps。我发现这与动态地向我的场景添加对象有关

比如说。当我的炮塔射击时,它运行这个代码

func shootBlaster(){
    let blaster = Projectile(color: SKColor.cyanColor(), size: CGSize(width: convertNum(3), height: convertNum(3)))
    blaster.name = "blaster"
    blaster.physicsBody = SKPhysicsBody(rectangleOfSize: blaster.size)
    blaster.physicsBody!.categoryBitMask = CategoryEnemyProjectile
    blaster.physicsBody!.contactTestBitMask = CategoryShip | CategoryShipShield
    blaster.physicsBody!.collisionBitMask = 0



    let fireAction = SKAction.runBlock({
        let angle = self.turret.base.zRotation + self.zRotation
        let velocity = CGPoint(angle: angle) * convertNum(420)
        let vector = CGVectorMake(velocity.x, velocity.y)
        let blas = blaster.copy() as Projectile
        blas.wpnDmg = 10
        blas.position = self.gameScene.gameLayer.convertPoint(self.turret.barrelPos, fromNode: self.turret.base)
        self.gameScene.gameLayer.addChild(blas)
        blas.physicsBody!.velocity = vector
        blas.zRotation = blas.physicsBody!.velocity.angle

        blas.runAction(SKAction.removeFromParentAfterDelay(1))
    })

    let recoilAction = SKAction.moveByX(-5, y: 0, duration: 0.08)
    let reverseRecoil = recoilAction.reversedAction()

    self.turret.barrel.runAction(SKAction.repeatAction(
        SKAction.sequence([
            recoilAction,
            fireAction,
            reverseRecoil
        ])
    ,count: self.blasterNum))

}

你可以看到我在每个fireAction块中添加了一个爆炸机。我注意到性能更好的游戏很少在运行时添加子级。似乎最好将所有内容都预先加载。在运行时加载资源会给事情带来压力,这是有道理的,但还有什么替代方案呢?我是否需要提前将所有内容添加到场景中,并以某种方式隐藏和显示它?

在任何类型的射击游戏中,如果你有许多射弹,你需要使用池。创建一个射弹池并重用它们,而不是在需要时创建新射弹

在任何类型的射击游戏中,如果你有大量的射弹,你都想利用合用。创建一个射弹池并重用它们,而不是在需要时创建新射弹

所以你认为addChild不是真正的问题。这是对象的动态实例化?当然。创建一个池,重用这些对象。问题解决了:addChild也可以扮演一个角色,但如果你把节点集中在一起,你就永远不会把它们作为子节点删除,你只需改变它们的隐藏属性,以防子弹在屏幕上飞来飞去。。我永远不会把它们拿走?我该怎么办?把它们改成隐藏的,然后重新设置它们的位置?这太棒了。当我添加孩子时,我确实看到一个小框架下降。但是,与池大约0.5帧下降与5帧下降,所以你认为addChild不是真正的问题。这是对象的动态实例化?当然。创建一个池,重用这些对象。问题解决了:addChild也可以扮演一个角色,但如果你把节点集中在一起,你就永远不会把它们作为子节点删除,你只需改变它们的隐藏属性,以防子弹在屏幕上飞来飞去。。我永远不会把它们拿走?我该怎么办?把它们改成隐藏的,然后重新设置它们的位置?这太棒了。当我添加孩子时,我确实看到一个小框架下降。但是,与池大约0.5帧下降与5帧下降