【问题标题】:SpriteKit Lots of Nodes from Same Image: Load Separately or Duplicate?SpriteKit 来自同一图像的大量节点:单独加载还是重复加载?
【发布时间】:2016-11-07 23:28:26
【问题描述】:

我正在使用 SpriteKit 编写游戏,并且正在编写从文本文件加载“关卡”的部分,在文本文件中每个用“x”标记的位置放置一个墙节点。但是,如果我知道会有很多节点,并且它们都是从同一个“wall.png”文件加载的,那么加载一次图像然后在每次需要时复制对象是否更有效,还是每次都加载图片?

for line in lines {
  for letter in line {
    if letter == "x" {
      let wall = SKSpriteNode(imageNamed: "wall")
      self.addChild(wall)
    } else { ... }
  }
}

VS

let wall = SKSpriteNode(imageNamed: "wall")
for line in lines {
  for letter in line {
    if letter == "x" {
      self.addChild(wall.copy())
    } else { ... }
  }
}

此范围内的self 是一个持有扩展 SKNode 的关卡的类,因此我将向self 添加墙,然后将该 SKNode 添加到场景中。

【问题讨论】:

  • 尝试这两种方法并计算在 iOS 收到内存不足警告之前可以添加多少。
  • 我更多地考虑加载它们的速度,我假设加载后两者的内存使用量相似?
  • 我觉得差不多,代码的复杂度是2^n,由2个for循环驱动,行self.addChild(wall.copy())或者let wall = SKSpriteNode( imageNamed: "wall") 可能不会增加更多时间。您可以尝试在for循环的开始和结束时添加增量时间并检查。

标签: swift image sprite-kit skspritenode 2d-games


【解决方案1】:

开发您的项目的方法记住我一个 TileMap。请注意,因为您可以节省大量时间来加载每个元素,您可以准备关卡并获得更多乐趣。

有数以千计的教程可以帮助您使用 Sprite-kit 和 Swift 构建 TileMap。他们中的许多人使用这个 GitHub 库,也称为 JSTileMap here

在这些教程中,您可以学习如何:

  • 使用 Tiled 创建地图
  • 将地图添加到游戏中
  • 滚动地图跟随玩家

  • 使用对象层。

很简单,比如你可以加载一张tmx的地图:

let tiledMap = JSTileMap("mapFileName.tmx") //map name
if t = tileMap {
    self.addChild(tiledMap)
}

【讨论】:

    【解决方案2】:

    在不求助于第 3 方支持的情况下回答您的问题

    使用第二个选项(复制选项)

    这将在多个精灵中使用相同的纹理,其中第一个选择会在每次迭代时创建一个新纹理。

    【讨论】:

    • 谢谢!如果我制作了一个纹理,并在一堆 SKSpriteNode 的初始化程序中使用了该纹理,是否会引用或复制该纹理?
    • 参考,如果您使用纹理图集。它也将在任何地方被引用
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2011-06-15
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多