我正在使用GameplayKit的GKObstacleGraph为我的iOS 10.2spritekit游戏添加路径查找支持。
游戏是一个自上而下的二维游戏,它的特点是不可逾越的障碍,我的'士兵'不能通过。
为我的游戏级别创建一个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
}

从理论上讲,这应该快得多,因为我不必计算图形,只需从文件中读取它(无存档)。
但是,根据障碍物的数量及其相对位置,会发生以下三种情况之一:
NSKeyedArchiver.archiveRootObject崩溃。
存档有效,但NSKeyedUnarchiver.unarchiveObject崩溃。
存档和非存档的作品,但我找不到GKObstacleGraph.find path绕过障碍的路径
如果跳过(取消)存档步骤,我可以让所有这些工作正常进行:
Successful path finding
而且,在模拟器(iPhone 7)上,(un)存档永远不会崩溃,但路径查找总是在之后失败。
这是怎么回事?我已经把它作为一个错误报告给苹果,但我仍然希望我漏掉了一些东西。
我尝试了另一种解决方案来解决我正在写入/读取节点和使用自己格式的文件障碍的问题。但是GKObstacleGraph的障碍属性是get only,这就留给了构造函数,然后我又回到等待50秒的状态。
我创建了一个公共测试项目git repo:
https://bitbucket.org/oixx/gkobstaclegraphcrashproof.git
这显示了在设备上运行时失败的三种不同情况。为了简单起见,它将文件读/写到设备,而不是绑定。

最佳答案

我对这些崩溃一无所知,但您列表中的#3可能是由于未将士兵实际连接到图形而导致的,因为节点数组在未归档后是不可变的。
解决方案是归档节点而不是图形,然后从节点创建一个图形

NSArray *nodes  = [NSKeyedUnarchiver unarchiveObjectWithData:self.nodesArray];
GKGraph *graph  = [[GKGraph alloc] initWithNodes:nodes];

关于ios - GKObstacleGraph <GKGraphNode2D>不处理存档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41922293/

10-10 17:50
查看更多