GKObstacleGraph <gkgraphnode2d>不处理归档

时间:2017-01-29 15:03:25

标签: ios swift sprite-kit path-finding gameplay-kit

我正在使用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
}

理论上,这应该快得多,因为我不必计算图表,只能从文件中读取它(解压缩)。

然而,根据障碍物的数量及其相对位置,发生以下三种情况之一:

  1. NSKeyedArchiver.archiveRootObject崩溃。
  2. 存档有效但NSKeyedUnarchiver.unarchiveObject崩溃。
  3. 存档和取消存档都有效,但我无法通过GKObstacleGraph.findPath找到障碍物的路径
  4. 如果我跳过(联合国)存档步骤,我可以完成所有这些工作:

    Successful path finding

    此外,在模拟器(iPhone 7)上,(联合国)存档从不崩溃,但之后路径查找始终失败

    这里发生了什么?我已将此报告为Apple的错误,但我仍然希望我错过了一些内容。

    我尝试了使用我自己的格式编写/读取节点和文件障碍的问题的替代解决方案。但是GKObstacleGraph的障碍属性只有得到,这让我得到了构造函数,然后我再次等待50秒。

    我已经创建了一个公共测试项目git repo:

    https://bitbucket.org/oixx/gkobstaclegraphcrashproof.git

    显示在设备上运行时失败的三种不同方案。为简单起见,它将文件读/写到设备,而不是捆绑。

1 个答案:

答案 0 :(得分:0)

我对坠机一无所知,但您列表中的#3可能是由于connectNodeToLowestCostNode:bidirectional:并未将您的士兵实际连接到图形而造成的,因为取消存档后节点数组是不变的。

解决方案是存档节点而不是图,然后仅从节点创建图

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