【问题标题】:Poor SpriteKit performance on iPhone 6+iPhone 6+ 上的 SpriteKit 性能不佳
【发布时间】:2015-01-23 01:52:39
【问题描述】:

我正在尝试编写 SpriteKit 游戏,但很快就遇到了问题。正如您在下面看到的,我在屏幕上绘制了大约 350 个简单节点。这会在我的 iPhone 6+ 上产生 ~25fps。

基本上我只是创建Section 对象(这是一个 SKNode),在每个对象中我循环 20 次并添加各个块。块在屏幕上缓慢移动。我不确定从哪里开始调试或显示代码的哪一部分,所以这里是附加块的 Section 类的摘录:

for i in 1...20 {
            let left = SKShapeNode(rectOfSize: CGSize(width: n, height: n))
            left.fillColor = randomColor()
            left.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: n - 1, height: n - 1))
            left.physicsBody?.dynamic = false


            left.position.x = (CGFloat(i) * n) - (size.width/2 + n/2)
            row.addChild(left)
            cubes.append(left)
        }

【问题讨论】:

  • 每个盒子都有一个物理实体(所以你可以尝试使用更少的实体)。位掩码以减少物理引擎完成的交叉检查次数

标签: ios iphone performance swift sprite-kit


【解决方案1】:

您的节点都是 skshapenodes。每个形状节点都会生成一个新的绘制调用,这就是为什么您在该场景中有 368 次绘制的原因——即使在最新的手机上也是如此。

我认为,SkShapeNode 从来没有打算用作游戏构建节点,而是可以用来可视化调试信息的节点。人们不应该仅仅因为它非常低效而在很大程度上基于或依赖形状节点来构建游戏。

相反,使用具有实际纹理的精灵,您会看到更好的性能。如果屏幕截图代表游戏的图形,您只需要一个白色的方形图像作为纹理,然后更改各个精灵的颜色属性以对其进行着色。

【讨论】:

  • 如何从节点创建 SKTextures 然后简单地使用纹理?在 OP 的情况下,它不会将绘制调用减少到... 5 吗?
  • 你也可以这样做,但老实说,我认为创建一个方形的白色图像并将其用作纹理会更容易和更快。
【解决方案2】:

LearnCocos2D 是正确的,您的问题不是节点数而是绘图调用数。

在您的情况下,您甚至不需要纹理,您可以仅从颜色和大小创建 SKSpriteNodes。唯一的问题是你会失去白色的笔触。

您也许可以将其放入:

for i in 1...20 {
    let left = SKSpriteNode(color: randdomColor(), size: CGSize(width: n, height: n))
    left.physicsBody = SKPhysicsBody(rectangleOfSize: CGSize(width: n - 1, height: n - 1))
    left.physicsBody?.dynamic = false

    left.position.x = (CGFloat(i) * n) - (size.width/2 + n/2)
    row.addChild(left)
    cubes.append(left)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多