我有一个我想在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。
答案 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之间的速度可能有所不同。