Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios GKObstacleGraph<;GKGraphNode2D>;不处理归档_Ios_Swift_Sprite Kit_Path Finding_Gameplay Kit - Fatal编程技术网

Ios GKObstacleGraph<;GKGraphNode2D>;不处理归档

Ios GKObstacleGraph<;GKGraphNode2D>;不处理归档,ios,swift,sprite-kit,path-finding,gameplay-kit,Ios,Swift,Sprite Kit,Path Finding,Gameplay Kit,我正在使用GameplayKit的GKObstacleGraph为我的iOS 10.2 SpriteKit游戏添加路径查找支持。 这个游戏是一个自上而下的2D游戏,它的特点是我的“士兵”无法穿越的不可逾越的障碍 为我的游戏级别创建一个GKObstacleGraph,大约500个障碍,需要约50秒。这对我的用户来说太长了,无法等待 由于游戏地图布局在加载后不会动态变化,因此我决定创建一次图形: let graph = GKObstacleGraph(obstacles: obstacles, bu

我正在使用GameplayKit的GKObstacleGraph为我的iOS 10.2 SpriteKit游戏添加路径查找支持。 这个游戏是一个自上而下的2D游戏,它的特点是我的“士兵”无法穿越的不可逾越的障碍

为我的游戏级别创建一个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
}
如果let filePath=Bundle.main.path(forResource:“障碍物”,类型为“图形”){
将graph=NSKeyedUnarchiver.unarchiveObject(带file:filePath)设为!GKObstacleGraph
返回图
}
从理论上讲,这应该要快得多,因为我不必计算图形,只需从文件中读取它(非归档)

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

  • NSKeyedArchiver.archiveRootObject崩溃
  • 存档工作正常,但NSKeyedUnarchiver.unarchiveObject崩溃
  • 归档和非归档都可以,但我无法使用GKObstacleGraph.findPath找到绕过障碍物的路径
  • 如果跳过(取消)归档步骤,我可以使所有这些都正常工作:

    此外,在模拟器(iPhone 7)上,(un)存档从不崩溃,但路径查找总是失败

    这是怎么回事?我已经把它作为一个bug报告给了苹果,但我仍然希望我错过了一些东西

    对于使用自己的格式写入/读取节点和文件障碍的问题,我尝试了其他解决方案。但是GKObstacleGraph的障碍属性是get,这让我有了构造函数,然后我又回到了等待50秒的状态

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


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

    我不知道关于崩溃的任何信息,但列表中的#3可能是由
    连接节点最低成本节点:双向:
    没有实际将士兵连接到图形,因为取消归档后节点数组是不可变的

    解决方案是归档节点而不是图形,然后从节点创建一个图形

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

    我不知道关于崩溃的任何信息,但您列表中的#3可能是由
    connectNodeToLowestCostNode:bidirectional:
    没有实际将您的士兵连接到图形造成的,因为取消归档后节点数组是不可变的

    解决方案是归档节点而不是图形,然后从节点创建一个图形

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