首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合并或扁平背景节点以提高游戏性能?

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

Stack Overflow用户
提问于 2017-10-15 20:33:55
回答 2查看 485关注 0票数 9

我想通过某种方式“平平”我的背景节点来提高我的游戏的性能。

这个youtube视频展示了我是如何建立我的背景图形的。

但是,我的背景图是这样设置的。

我使用两种纹理,如邮票,然后重复。在这种情况下..。一个雪顶的山体..。一座没有雪的山体。为了“分层”效果,我改变了这些邮票的zPosition。

然后,我使用“填充”,这是固体灰色的SKSpriteNodes,在需要灰色填充的部分上进行分层。

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

然后在山顶上添加一个带有alpha的彩色屏幕,使山顶呈现出褪色的外观。

例如,以前

例如,之后

游戏有时会冻结..。但当我移除这些图形时,它不会冻结。

是否有一种方法可以通过合并或平整基于zPosition的背景图形节点来提高性能?我该怎么做?

这会改善业绩吗?或者,在我的情况下,提高性能的最好方法是什么?

我觉得这个问题很相似..。将所有SKSpriteNode子级合并为一个SKSpriteNode

但是,我如何在Swift中做到这一点,并将zPosition和alpha考虑在内,这样我就不会失去分层效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-24 23:03:42

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

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

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

代码语言:javascript
复制
class GameScene: SKScene {

  var blitBackground = SKSpriteNode()

  override func didMove(to view: SKView) {

  }

}

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

代码语言:javascript
复制
func blit(from node: SKNode) -> SKSpriteNode {
  return SKSpriteNode(texture: SKView().texture(from: node))
}

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

代码语言:javascript
复制
  func blitTheBackground() { // use in didMove
    let laggyBackground = childNode(withName: "background")!
    blitBackground = blit(from: laggyBackground)
    laggyBackground.removeFromParent()
    addChild(blitBackground)
  }

以下是已完成的场景:

代码语言:javascript
复制
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.希望,对你来说,这也将有助于你的平局计数!

注意,这种方法对沙盘非常有效!

如果需要在循环中这样做,请确保将其放在自动释放池中,以确保内存在使用后被释放。从视图创建纹理需要使用大量的内存,因此如果您不小心创建纹理,您可能会遇到错误。

代码语言:javascript
复制
for i in 0..<5
{
    autoreleasepool{
        let laggyBackground = childNode(withName: "background\(i)")!
        blitBackground = blit(from: laggyBackground)
        laggyBackground.removeFromParent()
        addChild(blitBackground)
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-10-23 15:47:42

有些事你可能想做:

将前景和背景分离为单独的SKS文件,并通过SKReferenceNode将它们加载到您的主SKS文件中。

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

确保你的地图集不是以增加抽签数的方式被打破的。

设计代码时,并不是所有节点都在现场,节点越多,代码的速度就越慢。

如果你有SKPhysicsBody,试着尽可能少地使用。这可以是我把多个主体和SKPhysicBody(bodies:)合并在一起,或者创建一个包含多个对象的多边形的实体。

另外,如果你的身体没有通过物理运动(而不是通过SKAction),那么确保isDynamic被设置为false

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46759708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档