skift.ignoreSiblingOrder在swift中的重要性/效率?

Bre*_*ler 3 iphone ios swift

skView.ignoreSiblingOrder = true初始化场景时,它有多重要/有效?

现在,我把它设置为true,但出于某种原因,当我从MainMenu场景开始我的GameScene时,它会在我的角色之前加载背景(即使背景的代码是第一个),但是一旦我死了它就会修复并返回到主菜单然后加载另一个游戏场景.为了避免这个问题,我制作了一个布尔值,它基本上可以检测我何时玩过多个游戏.它现在功能但非常难看,我确信有更好的方法.

代码:(在touchesBegan)

                    let skView = self.view as SKView!
                    skView.showsFPS = true
                    skView.showsNodeCount = true
                    if spriteNode.name == "StartButton"
                    {


                        /* Sprite Kit applies additional optimizations to improve rendering performance */

                        //sets ignoreSiblingOrder to false the first game because of XCode Glitch where background was rendering over player for some reason
                        skView.ignoresSiblingOrder = false
                        if(Game){
                            skView.ignoresSiblingOrder = true
                        }

                        if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene
                        {
                            skView.presentScene(scene)
                            /* Set the scale mode to scale to fit the window */
                            scene.scaleMode = .AspectFill

                        }
Run Code Online (Sandbox Code Playgroud)

GameSceneCode:

override func didMoveToView(view: SKView)
{
    TheGame = SKNode()
    self.addChild(TheGame)

    createSky()
    createGround()
    addFireButton()
    addJumpButton()
    addHero(view)       

}
Run Code Online (Sandbox Code Playgroud)

重申一下,出于某种原因我玩的第一个游戏后面渲染了(因此结束)我的英雄和按钮,即使该createGround()功能在之后运行.以下是以下功能.

func addHero(view: SKView){
    //initializes our hero and sets his initial texture to running1
    hero = SKSpriteNode(texture: heroAtlas.textureNamed("10Xmini_wizard"))
    hero.xScale = 0.4
    hero.yScale = 0.4
    hero.position = CGPointMake(frame.width / 4.0, frame.height / 4.0)

    //creates some CG values for the hero to be used in its physics definitions
    let heroSize = CGSizeMake(hero.size.width, hero.size.height)
    let heroCenter = CGPointMake(hero.position.x/2, hero.position.y/2)
    self.addChild(hero);

}

func createGround()
{
    let groundTexture = SKTexture(imageNamed: "bg")
    groundTexture.filteringMode = .Nearest

    let moveGroundSprite = SKAction.moveByX(-groundTexture.size().width * 2.0, y: 0, duration: NSTimeInterval(0.01 * groundTexture.size().width * 1.0))
    let resetGroundSprite = SKAction.moveByX(groundTexture.size().width * 2.0, y: 0, duration: 0.0)
    let moveGroundSpritesForever = SKAction.repeatActionForever(SKAction.sequence([moveGroundSprite, resetGroundSprite]))

    for var i:CGFloat = 0; i < 2.0 + self.frame.size.width / (groundTexture.size().width * 2.0); ++i
    {
        let sprite = SKSpriteNode(texture: groundTexture)
        sprite.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: groundTexture.size().width, height: frame.height/8))
        sprite.physicsBody?.dynamic = false
        sprite.physicsBody?.restitution = 0
        sprite.setScale(2.0)
        sprite.position = CGPointMake(i * sprite.size.width, sprite.size.height / 2.0)
        sprite.runAction(moveGroundSpritesForever)
        TheGame.addChild(sprite)
    }
}
Run Code Online (Sandbox Code Playgroud)

ric*_*ter 5

如果ignoresSiblingOrder为false,则SpriteKit按照它们在其父children数组中存在的顺序呈现节点- 也就是说,数组顺序决定哪一个在"另一个"之上绘制.这也意味着SpriteKit必须一次渲染一个节点,因此您将失去OpenGL绘制调用开销的效率.

如果ignoresSiblingOrder是真的,SpriteKit完全依赖于zPosition属性来确定要绘制的顺序.这意味着它有时可以将同一z的所有内容组合成一个绘制,这使得渲染更快.但这也意味着如果你想控制哪些节点在哪些节点前面绘制,你需要zPosition适当地设置它们.