Skip to main content
 首页 » 操作系统

ios之Spritekit之动态添加 child 会降低性能

2024年01月01日46TianFang

我正在尝试弄清楚如何优化我的游戏。我有很多炮塔等射出物理物体。该游戏可以玩,但可以达到 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 block 中添加了一个“blaster”。我注意到性能更好的游戏很少在运行时添加子项。最好预先加载所有内容。在运行时加载资源会给事情带来压力是有道理的,但有什么选择呢?我是否需要提前将所有内容添加到场景中并以某种方式隐藏和显示它?

请您参考如下方法:

在任何类型的射击游戏中,如果您有大量射弹,您都希望利用“合并”。创建一个弹丸池并重复使用它们,而不是在需要时创建新的弹丸。