使用大型tilemap(JSTileMap)运行游戏时SpriteKit使用95-100%CPU

Nor*_*orm 5 objective-c ios sprite-kit jstilemap swift

我的项目在iPhone 6上的运行速度为55-60FPS,但是任何较旧的都是完全无法播放的,因为有些东西在吃CPU.

我认为这个问题与我地图上的图块和图层数量有关(64x256有4层),而Instruments显示"SKCRenderer:preprocessSpriteImp(..."运行时间为5198ms(23.2%).

JSTileMap是否一次加载每个图块的图像(可见或不可见)?来自RW的这篇文章表明情况就是这样,它可以解决大的性能提升:http://www.raywenderlich.com/forums/viewtopic.php?f = 29&t = 9479

在另一个性能注释中 - Sprite Kit检查它的所有节点并决定显示每个帧所需的节点.如果你有一个大的瓷砖地图,这可能是一个很大的性能影响.JSTileMap在加载tile map时加载所有节点(每个tile的SKSpriteNode).所以,我也看到Sprite Kit版本中的性能问题与我的地图(500 x 40个瓷砖).我在我的JSTileMap版本中添加了一个检查,该版本包含在套件中,用于标记每个图块的隐藏属性,然后智能地取消隐藏和隐藏进入/退出屏幕空间的图块.这显着提高了这些较大地图的性能.

不幸的是,该帖子没有详细说明为解决这个问题所采取的措施.

我的第一个想法是(我是初学者,请温柔)通过循环每个点并检查特定图层上的图块来创建节点数组.从那里开始,我会根据与玩家的距离来添加/删除它们.

这不起作用,因为向数组添加节点的过程只会导致应用程序永久挂在较大的地图上.

有人能伸出援助之手吗?我喜欢使用更大/更复杂的平铺图,但这个性能问题正在摧毁我的大脑.

谢谢阅读!

更新:非常感谢SKAToolKit: https ://github.com/SpriteKitAlliance/SKAToolKit

他们的剔除功能解决了我的问题,我现在在低于35%的CPU下运行更大的地图.

san*_*ony 2

JSTileMap 在处理较大的地图时存在一些问题,但您确实有几个选项需要考虑:

  1. 将大地图分成几个较小的部分,并根据需要加载每个新部分。
  2. 仅加载玩家附近的那些物体。
  3. 仅加载玩家附近的瓷砖。

我个人发现用 JSTileMap 不可能完成#3,因为我找不到保存地图图块的数组。我通过使用SKAToolKit解决了这个问题,它可以轻松访问地图图块数组。它是解析在 Tiled 中创建的地图的绝佳资源。