使用JSTileMap制作大型瓦片地图的SpriteKit游戏会占用95-100%的CPU。

5
我的项目在iPhone 6上以55-60FPS运行,但任何旧设备都无法运行,因为某些东西正在消耗CPU。
我认为问题与地图上的瓦片和层数有关(64x256,4层),Instruments显示"SKCRenderer:preprocessSpriteImp(..."占用了5198毫秒(23.2%)的运行时间。
JSTileMap是否会一次性加载每个瓦片的图像(可见或不可见)? RW的这篇文章表明情况确实如此,并且可以通过解决这个问题来大大提高性能: http://www.raywenderlich.com/forums/viewtopic.php?f=29&t=9479 在另一个性能注意事项中 - Sprite Kit会检查所有节点并决定每帧需要显示哪些节点。如果您有一个大的瓷砖地图,这可能会对性能造成很大影响。 JSTileMap在加载地图时会加载所有节点(每个瓷砖的SKSpriteNode)。因此,我在使用我的地图(500 x 40个瓷砖)的Sprite Kit版本中也遇到了性能问题。我在包含在该工具包中的JSTileMap版本中添加了一个检查,标记了每个瓷砖的隐藏属性,然后智能地显示和隐藏只进入/退出屏幕空间的瓷砖。这显著提高了这些更大地图的性能。
不幸的是,该文章没有详细介绍解决此问题所采取的步骤。
我的第一个想法是(我是初学者,请温柔点)通过循环遍历每个点并检查特定层上是否有瓷砖来创建一个节点数组。从那里开始,我将根据与玩家的距离添加/删除它们。
但这并没有起作用,因为将节点添加到数组的过程仅会导致应用程序在更大的地图上永远挂起。

有人能帮忙吗?我想处理更大/更复杂的瓦片地图,但性能问题让我很头疼。

谢谢阅读!

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

他们的裁剪功能解决了我的问题,现在我可以运行更大的地图,并且CPU使用率不到35%。


1
我们的SKA小组一直在开发一个用于加载平铺地图的工具包。你可能想试试看,看看是否有任何性能变化。https://github.com/SpriteKitAlliance/SKAToolKit 如果您遇到同样的问题,我会非常感兴趣。我已经投入了很多精力来优化它的性能。如果您没有得到所需的性能,我可以添加上述功能,只需要一个会导致您看到减速的示例地图即可。 - Skyler Lauren
谢谢Skyler!我今晚会仔细研究并告诉你它是如何工作的。 - Norm
@SkylerLauren 对于这些可怕的新手问题,我很抱歉,但我有几个问题:1)我是否需要一个桥接头来在Swift项目中使用此工具包,类似于JSTileMap?2)我必须以特殊方式打包纹理才能与JSON地图一起使用吗?我正在使用TexturePacker,并且之前一直在使用它们的Swift模板创建图集,这对TMX地图效果很好。我看到你的示例项目有一个TMX文件和JSON导出文件,而图像似乎不是以相同的图集格式出现的。非常感谢! - Norm
@SkylerLauren 还有一个问题:“在创建平铺地图SKATiledMap时,如果在瓦片或对象上找到这些属性,SKATiledMap将创建物理体。SKACollisionType:SKACollisionTypeRect”这是否意味着我需要在保存地图之前在Tiled中设置物理的自定义属性? - Norm
  1. 是的,我们还没有制作Swift版本,您将不得不进行桥接,但这在我们的待办事项列表中。
  2. 除了确保地图使用的.png文件在您的应用程序包中之外,您不需要做任何特殊的事情。
  3. 不,您不必使用自动生成的物理体。那只是一个额外的功能,使事情更容易。如果您有更多问题,请随时发送电子邮件至skyler@skymistdevelopment.com =)
- Skyler Lauren
非常感谢,我希望当我终于变得熟练时,能够为您的一些项目做出贡献。我一直是平铺式游戏的忠实粉丝,所以在这个领域工作就像梦想成真一样。祝您有美好的一天! - Norm
1个回答

2
JSTileMap在处理较大的地图时存在一些问题,但您有几个选项可以考虑:
  1. 将大型地图分成几个较小的部分,并根据需要加载每个新部分。
  2. 仅加载玩家附近的对象。
  3. 仅加载玩家附近的瓦片。
我个人发现使用JSTileMap无法完成第3个选项,因为我找不到保存地图瓦片的数组。 我通过使用SKAToolKit解决了这个问题,它提供了对地图瓦片数组的易于访问的接口。 它是解析使用Tiled创建的地图的绝佳资源。

1
Sangony,非常感谢您的回答。我今天之前从未听说过SKAToolKit,结合Skyler的推荐,这将让我尽快开始使用它。顺便说一句:由于我正在学习编程,我经常从您在SA上发布的答案中受益,您真是个巨大的帮助! - Norm
@Norm - 谢谢你的赞美 :) - sangony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接