连通性检测方法和系统、存储介质、终端与流程

文档序号:13875659阅读:325来源:国知局
连通性检测方法和系统、存储介质、终端与流程

本发明涉及游戏技术领域,具体而言,涉及一种连通性检测方法和系统、存储介质、终端。



背景技术:

目前大部分游戏采用的寻路都是基于recast寻路算法的系统。该系统通过构建一张导航网格(navmesh,由recast生成的地图寻路网格)来实现寻路的需求。导航网格通常线在该导航网格上寻路时,首先会通过a*算法搜索找出一条由凸多边形(poly,导航网格上的最小单位)构成的路径,再在这条由poly构成的路径上寻找拐点(corner,在poly构成的路径上导航时所经过的拐点),最后控制代理(agent,寻路系统控制的单位)行走在由corner组成的路径上。

在做大型多人在线(mmo,massivelymultiplayersonline)游戏的时候,经常遇到需要查询两个点之间是否寻路可达的需求。其本质问题就是查询两个点是否在同一个连通块上。

传统做法是通过查询是否存在一条由poly构成的路径,如果存在路径,则判定可达,否则不可达。该方法在两点连通的时候会花费一定时间查找路径,在两点不连通的时候,会花费大量时间遍历起始点所在的整个连通块,这种方法的效率很低,在有着庞大地图寻路网格的mmo游戏中是非常致命的。例如,在一个含有10000个poly的中等大小的场景中(相当于一个有10000个节点的平面图),搜索两个节点间是否有路径,运气好可以很快查到,比如两个节点离得很近,运气不好的时候可能就需要遍历10000个节点才能找到对方。假设两个节点不连通,就一定需要将这10000个节点遍历完才能判断出双方不连通。在节点的搜索中还要加上a*搜索本身的策略消耗,路径维护等,效率更低。

针对相关技术中的寻路算法效率较低的技术问题,目前尚未提出有效的解决方案。



技术实现要素:

本发明实施例提供了一种连通性检测方法和系统、存储介质、终端,以至少解决相关技术中的寻路算法效率较低的技术问题。

根据本发明实施例的一个方面,提供了一种连通性检测方法,该方法包括:获取寻路请求,其中,寻路请求用于请求查询在地图上的第一节点和第二节点是否处于同一连通块;响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,其中,每个连通标记的值分别用于标记对应的节点在地图上所处的连通块;根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块。

进一步地,根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块包括:分别判断第一节点的连通标记和第二节点的连通标记是否有效;在第一节点的连通标记和第二节点的连通标记均无效的情况下,对第一节点进行重标记操作,其中,重标记操作用于寻找对应的节点能够连通的所有节点,并将对应的节点能够连通的所有节点的连通标记设置为有效;判断在执行重标记操作之后第二节点的连通标记是否有效;如果判断结果为是,则确定第一节点和第二节点处于同一连通块;如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。

进一步地,根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块包括:分别判断第一节点的连通标记和第二节点的连通标记是否有效;在第一节点的连通标记和第二节点的连通标记之一无效的情况下,确定第一节点和第二节点不处于同一连通块。

进一步地,根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块包括:分别判断第一节点的连通标记和第二节点的连通标记是否有效;在第一节点的连通标记和第二节点的连通标记均有效的情况下,判断第一节点的连通标记的值和第二节点的连通标记的值是否相同;如果判断结果为是,则确定第一节点和第二节点处于同一连通块;如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。

进一步地,判断第一节点的连通标记或第二节点的连通标记是否有效包括:确定待判定节点的连通标记的值,其中,待判定节点为第一节点或第二节点;判断无效标记值集合中是否包括待判定节点的连通标记的值,其中,无效标记值集合为包括当前所有无效的连通标记的值的集合;如果判断结果为是,则确定待判定节点的连通标记无效;如果判断结果为否,则确定待判定节点的连通标记有效。

进一步地,判断无效标记值集合中是否包括待判定节点的连通标记的值包括:判断在地图中是否发生对障碍对象的修改,其中,障碍对象为能够影响连通性的对象;如果判断结果为是,则将发生修改的障碍对象所处的节点的连通标记的值加入无效标记值集合中。

根据本发明实施例的另一方面,还提供了一种连通性检测装置,该装置包括:第一获取单元,用于获取寻路请求,其中,寻路请求用于请求查询在地图上的第一节点和第二节点是否处于同一连通块;第二获取单元,用于响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,其中,每个连通标记的值分别用于标记对应的节点在地图上所处的连通块;判断单元,用于根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块。

进一步地,判断单元包括:第一判断模块,用于分别判断第一节点的连通标记和第二节点的连通标记是否有效;重标记模块,用于在第一节点的连通标记和第二节点的连通标记均无效的情况下,对第一节点进行重标记操作,其中,重标记操作用于寻找对应的节点能够连通的所有节点,并将对应的节点能够连通的所有节点的连通标记设置为有效;第二判断模块,用于判断在执行重标记操作之后第二节点的连通标记是否有效;第一确定模块,用于如果判断结果为是,则确定第一节点和第二节点处于同一连通块;第二确定模块,用于如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。

进一步地,判断单元包括:第三判断模块,用于分别判断第一节点的连通标记和第二节点的连通标记是否有效;第三确定模块,用于在第一节点的连通标记和第二节点的连通标记之一无效的情况下,确定第一节点和第二节点不处于同一连通块。

进一步地,判断单元包括:第四判断模块,用于分别判断第一节点的连通标记和第二节点的连通标记是否有效;第五判断模块,用于在第一节点的连通标记和第二节点的连通标记均有效的情况下,判断第一节点的连通标记的值和第二节点的连通标记的值是否相同;第四确定模块,用于如果判断结果为是,则确定第一节点和第二节点处于同一连通块;第五确定模块,用于如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。

进一步地,每个用于分别判断所述第一节点的连通标记和所述第二节点的连通标记是否有效的判断模块包括:第六确定模块,用于确定待判定节点的连通标记的值,其中,待判定节点为第一节点或第二节点;第六判断模块,用于判断无效标记值集合中是否包括待判定节点的连通标记的值,其中,无效标记值集合为包括当前所有无效的连通标记的值的集合;第七确定模块,用于如果判断结果为是,则确定待判定节点的连通标记无效;第八确定模块,用于如果判断结果为否,则确定待判定节点的连通标记有效。

进一步地,第六判断模块包括:第七判断模块,用于判断在地图中是否发生对障碍对象的修改,其中,障碍对象为能够影响连通性的对象;添加模块,用于如果判断结果为是,则将发生修改的障碍对象所处的节点的连通标记的值加入无效标记值集合中。

根据本发明实施例的另一方面,还提供了一种存储介质,该存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行本发明的连通性检测方法。

根据本发明实施例的另一方面,还提供了一种终端,该终端包括:一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序包括用于执行本发明的连通性检测方法。

在本发明实施例中,通过获取寻路请求,其中,寻路请求用于请求查询在地图上的第一节点和第二节点是否处于同一连通块;响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,其中,每个连通标记的值分别用于标记对应的节点在地图上所处的连通块;根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块,解决了相关技术中的寻路算法效率较低的技术问题,进而实现了能够更高效率地得到寻路结果的技术效果。

附图说明

此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:

图1是根据本发明实施例的一种可选的连通性检测方法的流程图;

图2是根据本发明实施例的另一种可选的连通性检测方法的流程图;

图3是根据本发明实施例的一种可选的连通性检测装置的示意图。

具体实施方式

为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。

需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。

本申请提供了一种连通性检测方法的实施例。

图1是根据本发明实施例的一种可选的连通性检测方法的流程图,如图1所示,该方法包括如下步骤:

步骤s101,获取寻路请求;

步骤s102,响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记;

步骤s103,根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块。

寻路请求用于请求查询在地图上的第一节点和第二节点是否处于同一连通块。

需要说明的是,地图中包括多个节点,每个节点是地图中的最小单元,每个节点的面积可以是任意的,一个连通块内至少包括一个节点,每个连通块内的所有节点是连通的,也即,一个连通块内的任意一个节点与另一个节点一定是连通的,是有路径的,以基于recast寻路算法的系统为例,每个节点是指一个poly。

下面对一种可能的获取寻路请求的情况进行举例,用户当前操作的对象在地图中的当前位置为a,当用户点击地图中的另一个位置b之后,分别确定位置a所在的节点为polya(第一节点),确定位置b所在的节点为polyb(第二节点),得到用于查询对第一节点与第二节点是否处于同一连通块的寻路请求。

响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,其中,每个连通标记的值分别用于标记对应的节点在地图上所处的连通块。连通标记的实现形式可以有多种,例如,连通标记可以是在初始化的时候为每个节点分配的一个属性,连通标记的值可以表示每个节点所在的连通块,同一连通块内的所有节点的连通标记的值相同,不同连通块的连通标记的值不同。

在获取第一节点的连通标记和第二节点的连通标记之后,根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块。

在根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块时,可以分别判断第一节点的连通标记和第二节点的连通标记是否有效,在不同的情况下具有不同的处理方法,具体而言:

在第一节点的连通标记和第二节点的连通标记均无效的情况下,对第一节点进行重标记操作,其中,重标记操作用于寻找对应的节点能够连通的所有节点,并将对应的节点能够连通的所有节点的连通标记设置为有效。在执行重标记操作之后,判断在执行重标记操作之后第二节点的连通标记是否有效,如果判断结果为是,则确定第一节点和第二节点处于同一连通块,如果判断结果为否,则确定第一节点和第二节点不处于同一连通块,这是因为,当对第一节点进行重标记操作之后,与第一节点连通的所有节点的连通标记均为有效的,那么,如果在对第一节点进行重标记操作之后第二节点仍是无效的,则说明第二节点与第一节点一定不在同一个连通块内,反之,如果第二节点是有效的,则说明在对第一节点进行重标记操作时,已将第二节点的连通标记设置为有效,那么第二节点必然与第一节点是属于同一连通块内的节点。

在第一节点的连通标记和第二节点的连通标记之一无效的情况下,确定第一节点和第二节点不处于同一连通块。这是因为,在本发明中,同一连通块内的所有节点的连通标记都是相同的,不仅同一个连通块内的所有节点的连通标记的值相同,所有节点的连通标记是否有效的属性也相同,因而,如果第一节点的连通标记与第二节点的连通标记是否有效的属性不同,则说明第一节点与第二节点一定不处于同一连通块。

在第一节点的连通标记和第二节点的连通标记均有效的情况下,则需要进一步判断第一节点的连通标记的值和第二节点的连通标记的值是否相同,如果判断结果为是,则确定第一节点和第二节点处于同一连通块,如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。需要说明的是,连通标记的值用于表示对应节点所在连通块的编号,每个连通块对应的编号不同,反之,同一连通块内所有节点的连通标记的值相同。

判断每个节点的连通标记是否有效可以是通过对每个节点分配一个有效标记,通过对有效标记的值进行赋值来标记该节点的连通标记是否有效,例如,有效标记的值为0,则说明该节点的连通标记无效,有效标记的值为1,则说明该节点的连通标记有效。

作为另一种可选的实施方式,判断每个节点的连通标记是否有效还可以是通过判断节点的连通标记的值是否在无效标记值集合中来判断,具体而言,无效标记值集合是用于存储当前所有无效的连通标记的值的集合,在确定待判定节点的连通标记的值之后,其中,待判定节点可以是第一节点或第二节点,判断无效标记值集合中是否包括待判定节点的连通标记的值,如果判断结果为是,则确定待判定节点的连通标记无效,如果判断结果为否,则确定待判定节点的连通标记有效。通过无效标记值集合保存所有的无效的连通标记的值,可以节约系统空间,无需为每个节点额外分配无效标记属性。

需要说明的是,上述所指的每个节点的连通标记在初始状态是无效的,当无效的节点被查找时,该节点所在的连通块被发现(重标记),变为有效的节点,并且,连通块内的所有节点的连通标记均为有效的,此外,随着地图中的动态变化,例如,障碍物的增加或删除,障碍物所在的连通块的连通属性会发生变化,那么,将障碍物所在的连通块的所有节点的连通标记设置为无效的(例如,将对应的连通标记的值加入到无效标记值集合中),也即,不需要在地图动态的变化过程中对连通块进行搜寻和标记,只在需要的情况下,也即,在上述判断出第一节点和第二节点两个节点的连通标记均无效的情况下执行重标记操作。通过这种“懒”标记的寻路方式,防止在游戏运行过程中任意动态的变化都会导致需要重新查找地图中的连通块,能够大大减小系统的负担,提高寻路的效率。

进而,在采用通过无效标记值集合来存储无效的连通标记的值的技术方案时,如果发生对地图中的障碍对象进行修改的情况,例如,增加障碍对象或删除障碍对象,都会影响地图中所在连通块的连通性,此时,需要将发生修改的障碍对象所处的节点的连通标记的值加入无效标记值集合中。

该实施例通过获取寻路请求,其中,寻路请求用于请求查询在地图上的第一节点和第二节点是否处于同一连通块;响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,其中,每个连通标记的值分别用于标记对应的节点在地图上所处的连通块;根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块,解决了相关技术中的寻路算法效率较低的技术问题,进而实现了能够更高效率地得到寻路结果的技术效果。

下面结合图2对上述实施例的一种应用场景进行描述如下:

在需要查询两点连通性的情况下,找到两点在寻路网格上对应的polya和polyb,查询polya和polyb的连通性,具体而言,需要判断polya和polyb的标记的有效性:如果只有一个是有效标记,则返回false,表示两点不连通;如果两个标记都是有效标记,则比较polya和polyb的标记值,如果相同,则返回ture,表示两点连通,如果不同,则返回false;如果两个标记都是无效标记,则对polya进行重标记,在进行重标记之后,比较polya和polyb的标记值,如果相同,则返回ture,如果不同,则返回false。

其中,每一个poly都有一个标记(连通标记),标记分两种,一种是无效标记,如果查询的两个poly均为无效标记,将按需进行重标记。一种是有效标记,该标记的值代表了当前查询poly的所在连通块的编号。(所有poly在初始化的时候身上的标记都是无效标记)。标记只记录状态,重标记只在真正需要的时候才会发生(也即,在不进行重标记就无法判断连通性的时候才进行重标记)。重标记操作的具体方法是遍历当前poly所在连通块的所有poly,为这些poly打上一个新的有效标记。寻路网格中可能会生成或者删除动态障碍物,当出现动态障碍物的修改时,需要重建所有有关的块(tile,寻路网格被分为多个块,在每个块中单独生成poly,也即,块是poly的上一级,注意:不同tile间的poly仍然有连边)。在生成或者删除这些动态障碍物的时候,会破坏掉原有的连通块性质,这个时候需要处理下相关poly的有效标记,当tile重建的时候,会先删除,再重建。删除tile的时候,将这些tile中包含的所有poly上的有效标记全部记录为无效标记(本来就是无效标记就不用管了,重建的tile中的poly在初始化的时候就会打上无效标记)。由于懒操作的机制,这里无需为无效标记的poly进行重标记。

上述方案中,只有重标记会造成额外的时间开销,在懒操作的基础上,只有不得不重标记的时候才会重标记,这种时候也只会在查询的时候发生,所以频繁的添加或删除动态障碍物不会造成性能问题。

由于动态障碍物的添加和删除一般只在mmo的位面中或者副本中出现,并且出现的频率也不高,所以重标记的频率也十分低。在游戏运行的尺度上,该方案的查询时间几乎为o(1)。

一种可选的在程序层面上执行上述实施方式的方式如下:

在初始状态下,在poly中添加flag属性,类型为int,用于记录标记,初始值为0。

在navmesh类中添加expiredflags属性,类型为set,其初始化时含有0,用于记录无效标记;并添加flagpool属性,类型为int,初始值为0,用于分配有效标记。

在执行重标记步骤时,navmesh本身是一个类似以poly为节点的平面图(平面图就是在某种节点的摆放方式下,边不交叉。不过是不是平面图在这里不重要,只需要知道是图就好了)。对连通块进行标记的方法就是从一个poly出发,搜索所有相连的poly即可。这里采用简单的宽度优先搜索即可。在搜索之前,向navmesh类请求分配一个有效的标记,做法就是将当前的flagpool+1,然后返回flagpool的值就行了。拿到有效标记后,在宽度搜索中,对搜索到的所有poly,将他们的flag值赋值为拿到的有效标记值。

在判断polya和polyb的标记步骤时,由于最开始所有的标记都是0,查询navmesh中的expiredflags可知这是一个无效标记。查询两个poly间是否连通的时候,先后查看两个poly的标记是否为有效标记,若均不是有效标记,则按需对其中一个poly进行重标记。

查询两个poly是否连通的时候有以下三种可能性。

a)两个poly的标记一开始就全是有效标记:这种情况下只需要比较两个标记是否相同就可以判断他们是否连通了。

b)其中一个是有效标记,另外一个无效标记:这种情况是可以直接判断出他们两个是不连通的,因为一个标记若是有效标记,那么它一定是一个独立的正确的连通块。那么,如果连通,另外一个poly上的标记一定会是相同的,不会存在无效标记。

c)两个都是无效标记:这种情况需要对其中一个poly进行重标记,重标记结束后,查看另一个poly的标记是否是新的有效标记了,如果仍然不是,判定为不连通。

在上面的解决办法中,将重标记的使用降低到最小,只有真正需要的时候才进行重标记,做到真正的懒。

维护标记有效性的流程为:

在添加或删除动态连通块的时候,首先移除相关tile,接着遍历相关tile中的poly,将这些poly的标记全部置为无效,筛入expiredflags容器中。

需要说明的是,在附图的流程图虽然示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。

本申请还提供了一种存储介质的实施例,该实施例的存储介质包括存储的程序,其中,在程序运行时控制存储介质所在设备执行本发明实施例的连通性检测方法。

本申请还提供了一种终端的实施例,该实施例的终端包括一个或多个处理器,存储器,显示装置以及一个或多个程序,其中,一个或多个程序被存储在存储器中,并且被配置为由一个或多个处理器执行,一个或多个程序包括用于执行本发明实施例的地图寻路方法。

本申请还提供了一种连通性检测装置的实施例。

图3是根据本发明实施例的一种可选的连通性检测装置的示意图,如图3所示,该装置包括第一获取单元10,第二获取单元20和判断单元30,其中,第一获取单元用于获取寻路请求,其中,寻路请求用于请求查询在地图上的第一节点和第二节点是否处于同一连通块;第二获取单元用于响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,其中,每个连通标记的值分别用于标记对应的节点在地图上所处的连通块;判断单元用于根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块。

该实施例通过第一获取单元获取寻路请求,通过第二获取单元响应于寻路请求,获取第一节点的连通标记和第二节点的连通标记,通过判断单元根据第一节点的连通标记和第二节点的连通标记判断第一节点和第二节点是否处于同一连通块,解决了相关技术中的寻路算法效率较低的技术问题,进而实现了能够更高效率地得到寻路结果的技术效果。

作为一种可选的实施例,判断单元包括:第一判断模块,用于分别判断第一节点的连通标记和第二节点的连通标记是否有效;重标记模块,用于在第一节点的连通标记和第二节点的连通标记均无效的情况下,对第一节点进行重标记操作,其中,重标记操作用于寻找对应的节点能够连通的所有节点,并将对应的节点能够连通的所有节点的连通标记设置为有效;第二判断模块,用于判断在执行重标记操作之后第二节点的连通标记是否有效;第一确定模块,用于如果判断结果为是,则确定第一节点和第二节点处于同一连通块;第二确定模块,用于如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。

作为一种可选的实施例,判断单元包括:第三判断模块,用于分别判断第一节点的连通标记和第二节点的连通标记是否有效;第三确定模块,用于在第一节点的连通标记和第二节点的连通标记之一无效的情况下,确定第一节点和第二节点不处于同一连通块。

作为一种可选的实施例,判断单元包括:第四判断模块,用于分别判断第一节点的连通标记和第二节点的连通标记是否有效;第五判断模块,用于在第一节点的连通标记和第二节点的连通标记均有效的情况下,判断第一节点的连通标记的值和第二节点的连通标记的值是否相同;第四确定模块,用于如果判断结果为是,则确定第一节点和第二节点处于同一连通块;第五确定模块,用于如果判断结果为否,则确定第一节点和第二节点不处于同一连通块。

作为一种可选的实施例,每个用于分别判断所述第一节点的连通标记和所述第二节点的连通标记是否有效的判断模块包括:第六确定模块,用于确定待判定节点的连通标记的值,其中,待判定节点为第一节点或第二节点;第六判断模块,用于判断无效标记值集合中是否包括待判定节点的连通标记的值,其中,无效标记值集合为包括当前所有无效的连通标记的值的集合;第七确定模块,用于如果判断结果为是,则确定待判定节点的连通标记无效;第八确定模块,用于如果判断结果为否,则确定待判定节点的连通标记有效。

作为一种可选的实施例,第六判断模块包括:第七判断模块,用于判断在地图中是否发生对障碍对象的修改,其中,障碍对象为能够影响连通性的对象;添加模块,用于如果判断结果为是,则将发生修改的障碍对象所处的节点的连通标记的值加入无效标记值集合中。

上述的装置可以包括处理器和存储器,上述单元均可以作为程序单元存储在存储器中,由处理器执行存储在存储器中的上述程序单元来实现相应的功能。

存储器可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram),存储器包括至少一个存储芯片。

采用本发明提供的技术方案能够带来以下有益效果:

能够明显地提升寻路的效率,其时间复杂度从传统的o(n)缩减为o(1),n代表地图中poly的个数。当应用在一个项目中时,寻路效果提升明显,进行了如下三类测试:

1、场景中测试从出身点查询和场景中所有npc(167个)的连通性(反复操作1000次):

a)旧方法:80.32s

b)优化后:1.745s

2、场景中选取随机点,从随机点到场景中所有npc(167个)的连通性(反复操作1000次):

a)旧方法:38.85s

b)优化后:1.706s

3、从所有npc(167个)查询和一个非联通点的位置的连通性(反复操作1000次):

a)旧方法:553.86s

b)优化后:1.707s

由此可见,提升寻路效率的效果是非常显著的。

上述本申请实施例的顺序不代表实施例的优劣。

在本申请的上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。在本申请所提供的几个实施例中,应该理解到,所揭露的技术内容,可通过其它的方式实现。

其中,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,可以为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,单元或模块的间接耦合或通信连接,可以是电性或其它的形式。

另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、服务器或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。

以上所述仅是本申请的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1