Ios GKObstacleGraph<;GKGraphNode2D>;不处理归档
我正在使用GameplayKit的GKObstacleGraph为我的iOS 10.2 SpriteKit游戏添加路径查找支持。 这个游戏是一个自上而下的2D游戏,它的特点是我的“士兵”无法穿越的不可逾越的障碍 为我的游戏级别创建一个GKObstacleGraph,大约500个障碍,需要约50秒。这对我的用户来说太长了,无法等待 由于游戏地图布局在加载后不会动态变化,因此我决定创建一次图形: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
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
返回图
}
从理论上讲,这应该要快得多,因为我不必计算图形,只需从文件中读取它(非归档)
但是,根据障碍物的数量及其相对位置,会发生以下三种情况之一:
这显示了在设备上运行时失败的三种不同场景。为简单起见,它将文件读/写到设备,而不是绑定。我不知道关于崩溃的任何信息,但列表中的#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];