每帧的最大纹理数是多少

时间:2014-11-02 12:38:48

标签: ios opengl-es sprite-kit

我有一个我想在iOS上运行的JavaScript游戏。 javascript发送要绘制的图像数量及其位置。我使用SpriteKit绘制图像,所以我从图像名称创建SKTexture并将其添加到父节点。

问题是我正在绘制30个纹理/帧。 iPad3的帧速率非常慢(在iPhone 5s上效果很好)。我注意到创建一个纹理需要0.178秒,而从字典加载它需要大约0.0036秒。

因此,对于30个纹理,更新一帧将需要0.1秒,而我需要它为0.016才能获得60 fps。

每帧30个纹理,是不是太多了?有什么替代方案?

Sprite是否使用正确的框架? 我想定位iOS7,iOS8。

修改 这是我如何获得纹理

 func getTexture(imageNamed: String) -> SKTexture?{
    if let texture = cache.getObject(imageNamed) {
        return texture
    }else {
        let texture = SKTexture(imageNamed)
        cache.putObject(texture, forName: imageNamed)
        return texture
    }
}

然后我将它添加到SpriteKit的节点:

if let texture = getTexture(imageName) {

     let imageNode = SKSpriteNode(texture:texture)
     imageNode.anchorPoint=CGPointMake(0, 1)
     imageNode.position = CGPoint(x:x, y:y)

     parentNode!.addChild(imageNode)
}

所以上面的代码将创建一次纹理并将其添加到缓存中,下次需要它时,它将从缓存中获取。目前我没有从缓存中释放纹理,因为它的纹理数量很少。

在下次更新时,我从parentNode中删除所有子项,然后根据新位置再次添加纹理。

我不想添加精灵的动作,因为我们已经在javascript中使用了游戏而且我们不想为iOS重写,所以我们只想在js之间添加一个层和iOS。

1 个答案:

答案 0 :(得分:0)

问题中仍然没有足够的信息来确定问题的确切位置,但这里有一些技巧可以帮助您改善概念。

  

在下次更新时,我从parentNode中删除所有子项,然后根据新位置再次添加纹理。

我不是百分百肯定,但很可能这是你的瓶颈之一。这不是基于SpriteKit的游戏应该如何设计的。通常应该:

  • 一旦它们变得可见,就将必要的精灵添加到场景图中
  • 移动对象以某种方式移动(不删除并重新添加)
  • 删除应该永久消失的节点
  • 隐藏节点,如果它们很快就会消失(有一个标志)

因此,您应该移动对象,而不是清除整个场景图。这并不一定意味着您必须使用SKActions,但建议这样做,因为它们针对运行动画进行了优化,例如移动内容。您还可以在更新步骤中更改任何SKNode的position属性。也许这已经足够允许30甚至60 fps。顺便说一句,现在总是需要以60 fps运行游戏。如果一切都缓慢移动,30 fps就足够了。

  

所以上面的代码将创建一次纹理并将其添加到缓存中,下次需要它时,它将从缓存中获取。目前我没有从缓存中释放纹理,因为它的纹理数量很少。

也许你也可以通过使用纹理图集来改善这一点。这减少了内存中实际纹理的数量,您仍然可以通过寻址文件名来加载相应的纹理。

  

我不想添加精灵的动作,因为我们已经在javascript中使用了游戏而且我们不想为iOS重写,所以我们只想在js之间添加一个层和iOS。

我从未将SpriteKit游戏与负责游戏逻辑的JavaScript结合起来。我无法说出影响有多大。但是如果你可以计算每个Sprite的位置,只需将Sprite移动到各自的位置 - 通过改变它们的位置,而不是将所有内容重新添加到场景图中。

JavaScript可能仍然是瓶颈。如果上述变化不足以达到30或60 fps,也许可以检查你的JS在iPad / iPhone上的运行速度是否足够快。在Mac / PC和iPhone / iPad上运行JS之间的速度可能有所不同。