合并或展平背景节点以提高游戏性能?

时间:2017-10-15 20:33:56

标签: swift sprite-kit skspritenode

我希望能够通过某种方式提高我的游戏性能"展平"我的背景节点。

This youtube video demonstrates how I build up my background graphics.

但是,我的背景图形设置如下。

我使用两个纹理,如邮票,然后重复。 在这种情况下......一个山顶纹理与雪顶... 没有雪的一个山纹理。 我改变了这些邮票的zPosition,用于"分层"影响。

enter image description here

enter image description here

然后我使用"填充"它们只是纯灰色的SKSpriteNodes,可以覆盖需要灰色填充的部分。

E.g。在添加填充节点之前

enter image description here

然后在顶部添加带有alpha的彩色屏幕,使山体看起来褪色。

E.g。之前 enter image description here

E.g。后 enter image description here

游戏有时冻结......但是当我删除这些图形时它并没有冻结。

有没有办法通过在场景加载时基于zPosition合并或展平我的背景图形节点来提高性能? 我该怎么做?

这会改善表现吗? 或者在我的案例中提高绩效的最佳方法是什么?

我认为这个问题类似...... Merge all SKSpriteNode children into a single SKSpriteNode

但是,我如何在Swift中执行此操作并将zPosition和alpha考虑在内,这样我就不会失去分层效果?

2 个答案:

答案 0 :(得分:5)

您可能想要做的事情:

将前景和背景分成单独的SKS文件,然后加载它们 通过SKReferenceNode

进入您的主要SKS文件

使用SKReferenceNode

通过代码将这些SKS文件转换为纹理而不是view!.texture(from: node) s

确保您的地图集没有以增加抽奖计数的方式分解

设计代码的方式不是所有节点都在场景中,节点越多,代码就越慢。

如果您有SKPhysicsBody,请尝试尽可能少地使用。这可以通过将多个实体与SKPhysicBody(bodies:)合并在一起或创建一个带有多边形的多边形体来完成。

此外,如果您的身体没有通过物理移动(不是SKAction s),请确保isDynamic设置为false

如果您正在运行SKAction,请确保尽可能少地使用这些内容。例如,如果有4个不同的节点以每秒10点的速度向左移动,则可以将这4个节点放入父节点,并在父节点上运行该操作。

答案 1 :(得分:4)

好的,所以这里有一个你现在拥有的例子..你的所有节点都是这样的:

enter image description here

如何轻松地执行bitblit是将所有这些移动到名为" background"

的新空节点下

enter image description here

现在转到swift文件,为我们将在代码中创建的新节点设置占位符变量

class GameScene: SKScene {

  var blitBackground = SKSpriteNode()

  override func didMove(to view: SKView) {

  }

}

现在,添加这个方便的功能,如果需要,可以在所有项目中使用:

func blit(from node: SKNode) -> SKSpriteNode {
  return SKSpriteNode(texture: SKView().texture(from: node))
}

以下是我们用来初始化bitblit背景的方法,并从游戏中删除迟到的方法:

  func blitTheBackground() { // use in didMove
    let laggyBackground = childNode(withName: "background")!
    blitBackground = blit(from: laggyBackground)
    laggyBackground.removeFromParent()
    addChild(blitBackground)
  }

这是完成的场景:

class GameScene: SKScene {

  var blitBackground = SKSpriteNode()

  func blit(from node: SKNode) -> SKSpriteNode {
    return SKSpriteNode(texture: SKView().texture(from: node))
  }

  func blitTheBackground() {
    let laggyBackground = childNode(withName: "background")!
    blitBackground = blit(from: laggyBackground)
    laggyBackground.removeFromParent()
    addChild(blitBackground)
  }

  override func didMove(to view: SKView) {
   blitTheBackground()
  }

}

它将节点数量从10减少到4 ...希望对你来说它也有助于你的抽奖计数!!

enter image description here 注意,这种方法对于shapenodes非常有效!!

如果需要在循环中执行此操作,请确保将其放在自动释放池中以确保在使用后释放内存。从视图创建纹理会占用大量内存,因此如果您不小心,可能会出现错误。

for i in 0..<5
{
    autoreleasepool{
        let laggyBackground = childNode(withName: "background\(i)")!
        blitBackground = blit(from: laggyBackground)
        laggyBackground.removeFromParent()
        addChild(blitBackground)
    }
}