加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:30:38 所属栏目:百科 来源:网络整理
导读:我希望通过某种方式“展平”我的背景节点来提高我的游戏性能. This youtube video demonstrates how I build up my background graphics. 但是,我的背景图形设置如下. 我使用两个纹理,如邮票,然后重复. 在这种情况下……一个山顶纹理与雪顶… 没有雪的一个山
我希望通过某种方式“展平”我的背景节点来提高我的游戏性能.

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

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

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

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

例如.添加填充节点之前

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

例如.之前

例如.后

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

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

这会改善表现吗?
或者在我的情况下提高性能的最佳方法是什么?

我觉得这个问题很相似……
Merge all SKSpriteNode children into a single SKSpriteNode

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

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

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

现在转到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 …希望对你来说它也有助于你的抽奖计数!!


注意,这种方法对于shapenodes非常有效!!

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读