我正在使用GameplayKit的GKObstacleGraph为我的iOS 10.2 SpriteKit游戏添加寻路支持。 这款游戏是一款自上而下的2D游戏,它具有无法通行的障碍,我的士兵和#39;无法走过。
为我的游戏关卡创建一个GKObstacleGraph,大约有500个障碍,需要大约50秒。这对我的用户来说太长了等待。
由于游戏地图布局在加载后从未动态变化,因此我决定创建一次图形:
let graph = GKObstacleGraph(obstacles: obstacles, bufferRadius: 5, nodeClass: GKGraphNode2D.self)
将其存档到档案:
let directories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
if let documents = directories.first {
if let filePath = String(documents + "/obstacle.graph") {
NSKeyedArchiver.archiveRootObject(graph, toFile: filePath)
}
}
将文件从设备复制到我的笔记本电脑,然后将文件添加到我的捆绑包中。然后我在加载游戏关卡时解压缩图形对象:
if let filePath = Bundle.main.path(forResource: "obstacle", ofType: "graph") {
let graph = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as! GKObstacleGraph<GKGraphNode2D>
return graph
}
理论上,这应该快得多,因为我不必计算图表,只能从文件中读取它(解压缩)。
然而,根据障碍物的数量及其相对位置,发生以下三种情况之一:
如果我跳过(联合国)存档步骤,我可以完成所有这些工作:
此外,在模拟器(iPhone 7)上,(联合国)存档从不崩溃,但之后路径查找始终失败。
这里发生了什么?我已将此报告为Apple的错误,但我仍然希望我错过了一些内容。
我尝试了使用我自己的格式编写/读取节点和文件障碍的问题的替代解决方案。但是GKObstacleGraph的障碍属性只有得到,这让我得到了构造函数,然后我再次等待50秒。
我已经创建了一个公共测试项目git repo:
https://bitbucket.org/oixx/gkobstaclegraphcrashproof.git
显示在设备上运行时失败的三种不同方案。为简单起见,它将文件读/写到设备,而不是捆绑。
答案 0 :(得分:0)
我对坠机一无所知,但您列表中的#3可能是由于connectNodeToLowestCostNode:bidirectional:
并未将您的士兵实际连接到图形而造成的,因为取消存档后节点数组是不变的。
解决方案是存档节点而不是图,然后仅从节点创建图
NSArray *nodes = [NSKeyedUnarchiver unarchiveObjectWithData:self.nodesArray];
GKGraph *graph = [[GKGraph alloc] initWithNodes:nodes];