[英]importance/Efficiency of skView.ignoreSiblingOrder in 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
}
GameSceneCode:
override func didMoveToView(view: SKView)
{
TheGame = SKNode()
self.addChild(TheGame)
createSky()
createGround()
addFireButton()
addJumpButton()
addHero(view)
}
重申一下,出于某种原因,我玩的第一个游戏背景渲染(以后)我的英雄和按钮,即使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)
}
}
当ignoresSiblingOrder
为false时,SpriteKit按照父节点的children
数组中存在的顺序呈现节点 - 也就是说,数组顺序决定哪一个节点“在另一个节点之上”。 这也意味着SpriteKit必须一次渲染一个节点,因此您将失去OpenGL绘制调用开销的效率。
当ignoresSiblingOrder
为true时,SpriteKit完全依赖于zPosition
属性来确定要绘制的顺序。这意味着它有时可以将同一z的所有内容组合到一个绘图中,这样可以更快地渲染。 但这也意味着如果你想控制哪些节点在哪些节点前面绘制,你需要适当地设置它们的zPosition
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.