【问题标题】:SpriteKit max number of nodesSpriteKit 最大节点数
【发布时间】:2013-10-25 00:24:26
【问题描述】:

我正在创建一个带有平铺地图的 SpriteKit 游戏。每个图块都是一个 SKSprite 节点。当我有大约 800 块瓷砖时,就没有问题了。但是如果我尝试将地图的大小增加到大约 2000 个图块,我的 FPS 会从 60 变为 20。屏幕上的图块节点的数量不会改变(大约 80),只是屏幕外的节点数。关于可能导致此问题的原因或如何解决的任何想法?

【问题讨论】:

  • Kobold Kit 中的瓦片地图渲染器只绘制可见瓦片。 koboldkit.com你的地图有多大?几层?你是对每个图块做一些事情还是它们只是静态精灵?
  • 图块不是动态的,但它们确实有物理实体。这是一个挖掘游戏,所以“玩家”通过重力坐在这些瓷砖的顶部,并在他四处移动时将它们从场景中移除。我想映射到大约 40 瓦宽和 200 瓦高。
  • 生成 8.000 个物理物体,难怪事情变慢了。不过你不需要物理,一个简单的 CGRectIntersect 测试 + 速度积分就足够了
  • 他说得对,我对物理实体的工作并不多,但是是否有可能只将物理应用到角色附近的图块上,而不是一次应用到整个地图?
  • 您可以将物理实体更改为非动态(将动态设置为 false),然后打开仅我们需要的动态。这将减少运行速度较慢的 FPS。动态有助于忽略应用于“地面”平铺地图单元的模拟。你可以在屏幕外有一个假的墙精灵,当​​它穿过它时,动态标志会被打开。在某些游戏中,最好只在关键元素上使用物理。不是整个游戏。您仍然可以在动态关闭的情况下检测碰撞。我目前的游戏有 1200 个节点/60fps,并不是所有的元素都同时是动态的。

标签: ios sprite-kit


【解决方案1】:

似乎没有定义的最大节点数。这实际上取决于您设备上可用的可用内存量。例如考虑以下代码:

int NODE_LIMIT = 375000
....

    for (int i = 0; i<NODE_LIMIT; i++) {
        SKNode *node = [SKNode node];
        [self addChild:node];
    }

我可以在我的 sprite kit 游戏中创建 375000 个节点。但是当我增加上面的数字时,我的设备内存不足。设备上的可用内存量会因多种因素而异。 正如 cmets 中所述,您的帧速率变慢的原因是,物理模拟即使对于屏幕上不可见的节点也会运行。

要保持高帧速率,请去掉不可见或不需要每帧都模拟的物理实体。您可以通过仅在屏幕可见部分中添加精灵/物理体来实现此目的,并在它们不在时将其移除。

【讨论】:

  • SKNode和SKSpriteNode有很大的不同,尤其是它的显示方式...
猜你喜欢
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多