使用SpriteKit渲染大网格

时间:2016-11-28 16:24:12

标签: ios sprite-kit sknode

我是SpriteKit和游戏开发的新手,我一直在玩SpriteKit来制作太空战略游戏。

我的后端架构使用网格系统来表示宇宙,我有空案例和系统/行星/等等... 我的网格由GameplayKit GKGridGraph支持,我使用一种算法为网格的每个节点生成一个具有随机属性的节点,我将其子类化为其添加一个自定义实体,该特定Universe案例的所有属性。

要渲染它,我只需使用SKShapeNodeSKPriteNode各种颜色,形状和纹理。

我枚举了GKGridGraphNode实例中的所有节点(GKGridGraph),并为每个节点生成相应的SKNode(我的SKNode代是一个组件每个GKGridGraphNode实体附加对象),我设置一个位置,并将它们作为子项添加到我的主节点(让我们称之为mapNode),这是一个简单的SKNode。最后,它看起来像一个网格。

它适用于30/30网格,我在滚动网格时有60 FPS(自定义实现,当用户移动他的手指时我修改我的mapNode位置)。 但是当我尝试50/50或100/100网格时,屏幕上的节点实际上太多了,无法进行滚动。我知道我不应该在屏幕上添加我的每个节点,所以我想到了各种策略,我想要一些输入:

  • 我只能渲染我在屏幕上看到的节点,而不是滚动我的mapNode,然后在用户向左/向右/向上/向下滚动时添加/删除节点。所以它不再滚动,它模拟它。我能想到它,但不是我应该如何在实践中实现它。这是正确的解决方案吗?

  • 也许我可以将我的所有节点渲染为一个大节点?有没有办法做到这一点?但是我会松开nodeAtPosition之类的函数,我广泛使用它来获取与我的节点相关联的实体(自定义对象)。

编辑:实际上,我当前的代码是开源的,这是我渲染的场景:https://github.com/Dimillian/LittleOrion/blob/master/Little%20Orion/Little%20Orion/scenes/UniverseScene.swift

还有其他聪明的方法吗?

1 个答案:

答案 0 :(得分:2)

SKTileMapNode是在Xcode 8中为此而制作的 https://www.raywenderlich.com/137216/whats-new-spritekit-ios-10-look-tile-maps

或者,您只想加载当前视图中和附近的节点。你需要一个算法才能做到这一点,与瓷砖地图相比,这将是一个很大的麻烦。

我怀疑算法将涉及检查视图的.frame' and then using 'addChild' on them--concurrently, add a reference to them to an array, which you would check against next更新()and removeFromParent`中的哪些节点,如果它们不再可见的话。 尽管如此,尝试优化它会变得毛茸茸。目标是在每一端只加载几个节点,这样你在移动相机时就会有一些缓冲(更少的更新)。

您可以创建一个数学函数来预先确定哪些节点与当前帧坐标相关 - 这样您就不必遍历节点 - 但这需要更多的工作和头痛 - 这是人们在游戏机上开发的东西,与高端游戏和有限的力量有关。

我建议浏览一下Direct3d / DirectX / OpenGL游戏开发书,只是为了了解一切内容......他们不难发现:走进书店,寻找最厚/最重的书 - 这将是DirectX游戏开发书。

您将看到我们如何使用SK中的30行可以在C ++和低级AV框架中使用数千行和向量计算。它将为您提供游戏开发的欣赏,理解和观点,这将有助于您的SK旅程:)