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

Cor*_*y F 9 sprite-kit skspritenode swift

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


这个YouTube视频演示了我如何构建我的背景图形.


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

我使用两个纹理,如邮票,然后重复.在这种情况下......一个山顶纹理与雪顶...一个没有雪的山地纹理.我改变了这些邮票的zPosition以获得"分层"效果.

在此输入图像描述

在此输入图像描述

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

例如,在添加填充节点之前

在此输入图像描述

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

以前 在此输入图像描述

比如之后 在此输入图像描述


游戏有时冻结......但是当我删除这些图形时它不会冻结.

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

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

我认为这个问题类似......将 所有SKSpriteNode子项合并为一个SKSpriteNode

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

Kni*_*gon 5

你可能想做的事情:

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

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

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

以不是所有节点都在场景中的方式设计代码,节点越多,代码变得越慢.

如果你有SKPhysicsBody,尽量少用.这可以通过将多个实体合并在一起SKPhysicBody(bodies:)或创建一个具有围绕多个对象的多边形的主体来完成.

此外,如果你的身体没有通过物理移动(不是由SKActions),那么请确保isDynamic设置为false

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


Flu*_*ity 4

好的,这是您现在拥有的示例..这里的所有节点如下所示:

在此输入图像描述

如何轻松执行 bitblit 是将所有这些移动到一个名为“background”的新空节点下

在此输入图像描述

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

class GameScene: SKScene {

  var blitBackground = SKSpriteNode()

  override func didMove(to view: SKView) {

  }

}
Run Code Online (Sandbox Code Playgroud)

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

func blit(from node: SKNode) -> SKSpriteNode {
  return SKSpriteNode(texture: SKView().texture(from: node))
}
Run Code Online (Sandbox Code Playgroud)

这是我们用来初始化 bitblit 背景并从游戏中删除滞后背景的方法:

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

这是完成的场景:

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()
  }

}
Run Code Online (Sandbox Code Playgroud)

它将节点数量从 10 个减少到 4 个……希望对您来说,它也能帮助您提高抽奖数量!

在此输入图像描述 注意,此方法对于形状节点非常有效!

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

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