行为树的执行优化方法、装置及存储介质与流程

文档序号:18401805发布日期:2019-08-09 23:58阅读:349来源:国知局
行为树的执行优化方法、装置及存储介质与流程

本发明实施例涉及游戏人工智能(artificialintelligence,简称:ai),尤其涉及一种行为树的执行优化方法、装置及存储介质。



背景技术:

为了玩家创造引人入胜的体验,游戏ai几乎存在于游戏中的每个角落,构建出一个个令人神往的庞大游戏世界。因此,设计良好的游戏ai,可以增加游戏的交互性,提高玩家的真实感和黏性。游戏ai的实现方式很多,从一开始的基于规则的固化代码实现,到基于状态的有限状态自动机,再到现在主流的基于行为树,不断开放和简化的逻辑让策划人员也可以积极参与到游戏ai的编写中来。

具体地,行为树包括大量的树节点,程序人员通过实现一个个树节点,提供了各项基础的节点函数,其中节点函数包括控制节点函数和行为节点函数。策划人员通过组合这些树节点,让游戏单位可以针对周围的游戏环境,做出合适的行为反应。

一方面,为了防止客户端作弊,行为树通常运行在服务端;另一方面,为了玩家反馈及时,行为树中节点函数又被高频率地调用;再一方面,行为树中存在大量的节点函数,这些特性都意味着基于行为树的游戏ai实现会带来大量的处理器资源开销。



技术实现要素:

本发明实施例提供一种行为树的执行优化方法、装置及存储介质,以减少服务端运行行为树带来的处理器资源开销。

第一方面,本发明实施例提供一种行为树的执行优化方法,包括:

读取一初始行为树执行文件,获取所述初始行为树执行文件相应的行为树中的控制节点函数,所述行为树包括控制节点函数和行为节点函数;

分析所述控制节点函数,得到所述行为节点函数的执行顺序;

根据所述行为节点函数的执行顺序,重新构建所述行为树执行文件,所述重新构建后的行为树执行文件中包含全部所述行为节点函数,所述重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于所述初始行为树执行文件相应的行为树中包含的控制节点函数的个数;

根据所述重新构建后的行为树执行文件执行所述行为树。

第二方面,本发明实施例提供一种行为树的执行优化装置,包括:

获取模块,用于读取一初始行为树执行文件,获取所述初始行为树执行文件相应的行为树中的控制节点函数,所述行为树包括控制节点函数和行为节点函数;

分析模块,用于分析所述控制节点函数,得到所述行为节点函数的执行顺序;

构建模块,用于根据所述行为节点函数的执行顺序,重新构建所述行为树执行文件,所述重新构建后的行为树执行文件中包含全部所述行为节点函数,所述重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于所述初始行为树执行文件相应的行为树中包含的控制节点函数的个数;

执行模块,用于根据所述重新构建后的行为树执行文件执行所述行为树。

第三方面,本发明实施例提供一种行为树的执行优化装置,包括:

用于存储程序指令的存储器和处理器;

当所述程序指令被所述处理器执行时,使得所述行为树的执行优化装置实现如第一方面中任一项所述的方法。

第四方面,本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面中任一项所述的方法。

本发明实施例提供一种行为树的执行优化方法、装置及存储介质,首先读取一初始行为树执行文件,获取初始行为树执行文件相应的行为树中的控制节点函数,该行为树包括控制节点函数和行为节点函数,之后,分析控制节点函数,得到行为节点函数的执行顺序,并根据行为节点函数的执行顺序,重新构建行为树执行文件,其中,重新构建后的行为树执行文件相应的行为树中包含全部行为节点函数,重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,根据重新构建后的行为树执行文件执行行为树。由于重新构建后的行为树执行文件相应的行为树中包含的控制节点函数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,去除了至少部分控制节点函数的执行,从而减少行为树在控制跳转上的执行时间,降低处理器资源开销。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图做一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明一实施例提供的行为树的执行优化方法的流程图;

图2为一个游戏中的猎人ai行为树示例图;

图3为图2所示猎人ai行为树在优化后的跳转示意图;

图4为包含有特殊控制节点的行为树示例图;

图5为本发明一实施例提供的优化率相对展开率的分布示例图;

图6为本发明一实施例提供的行为树的执行优化装置的结构示意图;

图7为本发明另一实施例提供的行为树的执行优化装置的结构示意图。

具体实施方式

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

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

本发明下述实施例所涉及的方法流程图仅是示例性说明,不是必须包括所有的内容和步骤,也不是必须按照所描述的顺序执行。例如,有些步骤还可以分解,而有些步骤可以合并或部分合并,因此,实际执行的顺序可根据实际情况改变。

本发明下述实施例所涉及的方框图中的功能模块仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或者不同网络和/或处理器和/或微控制器中实现这些功能实体。

为解决基于行为树的游戏ai实现会带来大量的处理器资源开销的技术问题,本发明实施例提供了一种基于控制节点展开的行为树的执行优化方案,通过对行为树中控制节点函数的分析,得到每一个行为节点函数执行成功或者失败之后下一个需要执行的行为节点函数,从而跳过控制节点函数,直接构建出一条从头执行到尾的行为链。该构建过程可以看成是控制节点函数的展开,因为重新构建成功后行为树中将只剩下真正需要执行的行为节点函数,或,需要执行的行为节点函数和少量控制节点函数。

如下结合多个实例对本发明实施例提供的行为树的执行优化方法、装置及存储介质进行说明。

图1为本发明一实施例提供的行为树的执行优化方法的流程图。该行为树的执行优化方法可由服务端或终端的处理设备,例如处理器,执行相应的软件代码实现,也可由该服务端或终端的处理设备执行相应的软件代码,并结合其他硬件实体实现。其中,服务端例如是服务器,终端例如是手机、平板等可运行单机游戏的设备。其中,服务器可以是一台服务器,或者由若干台服务器组成的服务器集群,或者是一个云计算服务中心,等等。

如图1所示,本实施例所示的行为树的执行优化方法方法包括如下步骤:

s101、读取一初始行为树执行文件,获取初始行为树执行文件相应的行为树中的控制节点函数。

其中,行为树包括控制节点函数和行为节点函数。

s102、分析控制节点函数,得到行为节点函数的执行顺序。

s103、根据行为节点函数的执行顺序,重新构建行为树执行文件。

其中,重新构建后的行为树执行文件相应的行为树中包含全部行为节点函数,且,重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数。

s104、根据重新构建后的行为树执行文件执行行为树。

图2为一个游戏中的猎人ai行为树示例图。如图2所示,该猎人ai行为树包含的节点有:

入口节点:entry;

顺序节点:sequence;

选择节点:selector;

以及,行为节点:早上(morning?),饥饿(hunger?),打猎(hunt),晚上(night?),睡觉(sleep)。

该行为树的逻辑是猎人ai早上饥饿时去打猎,晚上睡觉。

其中,顺序节点和选择节点均属于控制节点。

若无特殊说明,在行为树中,最上面的节点为入口节点,为行为树的入口;中间的节点属于控制节点,用于控制执行流程的跳转;最下面的节点属于行为节点,用于执行实际的功能。每个节点都会返回成功或者失败。其中,涉及入口节点的函数称为入口节点函数,涉及控制节点的函数称为控制节点函数,涉及行为节点的函数称为行为节点函数。

分析这颗猎人ai行为树可知,每次执行时,第一个执行的行为节点一定是最左下角的"morning?"节点;如果该节点执行成功,因为它的父节点是sequence节点,所以下一个执行的一定是"hunger?"节点;如果该节点执行失败,也就表示父节点sequence节点执行失败,而该节点的爷爷节点是selector节点,所以会去执行下一个sequence节点里面的第一个行为节点,也就是“night?”节点。以此类推,就会得到如图3所示的跳转图,其中跳转线指向当前节点执行成功或失败时的下一个将要执行的行为节点,“1”表示当前节点执行成功,“0”表示当前节点执行失败。

待优化执行的猎人ai行为树包含9个函数,分别对应行为树中的9个节点,其中4个控制节点函数,5个行为节点函数,控制节点函数不执行任何行为功能,只负责对行为节点函数进行调用。

在通过上述s101至s103的处理之后,得到的将控制节点函数展开后的行为树执行文件,其仅包含5个行为节点函数,原先的4个控制节点函数都被删除了。在新的行为节点函数中,除了包含原先的功能外,还额外包括了执行成功或者失败后,下一次需要执行的行为节点函数,从而可以复刻原先待优化执行的猎人ai行为树的执行逻辑。优化后,取消了最多4次函数调用,而在程序语言中,函数调用的处理器开销很大,其中包含参数压栈、帧创建、递归保护、异常机制等过程,所以该行为树执行文件的整体执行时间可预见地会减少。

对比优化前后的行为树代码,后者比前者少了部分控制节点函数带来的开销。在游戏项目开发的后期,由于游戏ai功能的完善,行为树都十分庞大和臃肿,包含大量的节点函数,其中大约有一半是控制节点函数,通过对这些控制节点函数的展开,减少函数调用次数,以提高行为树执行文件的执行效率。

需要说明的是,本发明实施例可以看成是对原有行为树代码的一次重构,因此无需改变行为树的调用方式,可以直接无缝集成在行为树执行文件的导出过程中。

在实际应用中,为了将初始行为树执行文件相应行为树中的控制节点函数展开,可以引入以下三个函数:

1.get_start_node获取当前节点下,第一个执行的行为节点

2.get_next_node_true获取当前节点执行成功时,下一个执行的行为节点

3.get_next_node_false获取当前节点执行失败时,下一个执行的行为节点

这样,整个优化流程就可以简述为:

第1步、定义一个容器c;

第2步、通过get_start_node获取入口节点下第一个执行的行为节点s;

第3步、将行为节点s加入容器c;

第4步、从容器中取出一个节点curr_s;

第5步、通过get_next_node_true获取当前节点curr_s执行成功时下一个执行的行为节点next_ture_s;

第6步、在当前节点curr_s上记录下next_ture_s,并将next_ture_s加入容器c;

第7步、通过get_next_node_false获取当前节点curr_s执行失败时下一个执行的行为节点next_false_s;

第8步、在当前节点curr_s上记录下next_false_s,并将next_false_s加入容器c;

第9步、重复第4步-第8步,直到容器c为空。

通过上述优化流程,可以在每个行为节点上记录该行为节点执行成功或者失败后下一个执行的行为节点,从而可以依次执行每个行为节点,完成整个行为树的功能。

本发明实施例的行为树的执行优化方法,首先读取一初始行为树执行文件,获取初始行为树执行文件相应的行为树中的控制节点函数,该行为树包括控制节点函数和行为节点函数,之后,分析控制节点函数,得到行为节点函数的执行顺序,并根据行为节点函数的执行顺序,重新构建行为树执行文件,其中,重新构建后的行为树执行文件相应的行为树中包含全部行为节点函数,重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,根据重新构建后的行为树执行文件执行行为树。由于重新构建后的行为树执行文件相应的行为树中包含的控制节点函数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,去除了至少部分控制节点函数的执行,从而减少行为树在控制跳转上的执行时间,降低处理器资源开销。

在本发明任一实施例中,控制节点函数可以仅包含涉及通用控制节点的控制节点函数。此时,行为树执行文件中仅包含行为节点函数,不包含控制节点函数。

可以理解,由于行为树执行文件中去除了通用控制节点函数的执行,从而减少行为树在控制跳转上的执行时间,降低处理器资源开销。

可选地,通用控制节点可以包括以下至少一个:顺序节点、选择节点、声明成功节点、声明失败节点和声明取反节点等。其中:

顺序节点,表示顺序执行到其对应的子节点,直至一子节点返回失败。

选择节点,表示顺序执行到其对应的子节点,直至一子节点返回成功。

声明成功节点,表示执行其对应的子节点,并返回成功。

声明失败节点,表示执行其对应的子节点,并返回失败。

声明取反节点,表示执行其对应的子节点,并将其子节点的返回值取反。

对于上述提及的各节点,其对应的详细信息如表1所示。

表1

对应表1,下面给出之前引入的三个函数的具体实现。

1.get_start_node的具体实现

如果当前节点是行为节点,说明没有子节点,第一个执行的是当前节点;否则,说明当前节点是一个控制节点,包含数量大于0的子节点,第一个执行的一定是第一个子节点,但是由于第一个子节点有可能还是一个控制节点,所以需要递归往下找。

2.get_next_node_true的具体实现

对于计算任意节点执行成功后下一个执行的行为节点,需要分析其父节点:

如果当前节点的父节点是入口节点,说明当前节点执行完后整个行为树就执行完了,而当前节点目前执行成功,所以返回成功(true);

如果当前节点的父节点是选择节点,因为选择节点执行到一个子节点执行成功即停止并返回成功,所以需要观察父节点的父节点,这里会递归调用父节点的get_next_node_true;

如果当前节点的父节点是顺序节点,因为顺序节点的子节点执行成功就会一直执行下去,所以如果当前节点有下一个兄弟节点,因为下一个兄弟节点有可能是控制节点,就需要返回下一个兄弟节点的get_start_node结果;如果没有下一个兄弟节点,则代表父节点执行结束并且返回成功,所以递归调用父节点的get_next_node_true即可;

如果当前节点的父节点是声明成功节点,无论子节点的执行结果是什么,父节点永远返回成功,所以这里递归调用父节点的get_next_node_true即可;

如果当前节点的父节点是声明失败节点,无论子节点的执行结果是什么,父节点永远返回失败,所以这里递归调用父节点的get_next_node_false即可;

如果当前节点的父节点是声明取反节点,而当前节点执行成功,说明父节点会返回失败,所以这里递归调用父节点的get_next_node_false即可.

3.get_next_node_false的具体实现

该函数功能和get_next_node_true类似,此处不再赘述解释。

因此,作为一种可选方案,s102、分析控制节点函数,得到行为节点函数的执行顺序,可以包括:对于每一控制节点函数,获取控制节点函数对应的第一个执行的行为节点函数;根据行为节点函数的父节点,确定行为节点函数执行成功或失败后下一个执行的行为节点函数,直至控制节点函数中所有行为节点函数执行完。

上述提到的控制节点只有5个基本类型,虽然一个项目中大部分的行为树用这5个基本类型就可以完成逻辑任务,但是每个项目都或多或少有一些自己专用的特殊控制节点。

因此,一些实施例中,控制节点函数还包括涉及特殊控制节点的控制节点函数。此时,初始行为树执行文件相应的行为树中的控制节点函数同时包含涉及通用控制节点的控制节点函数和涉及特殊控制节点的控制节点函数。对应该种情况,重新构建后的行为树执行文件相应的行为树中同时包含全部行为节点函数和涉及特殊控制节点的控制节点函数。

可选地,特殊控制节点可以包括以下至少一个:并行节点、随机节点、乱序选择节点和单次节点等。其中:

并行节点,表示顺序执行其对应的所有子节点。

随机节点,表示随机选择其对应的一个子节点执行。

乱序选择节点,表示乱序执行其对应的子节点,直至其中一子节点反馈成功。

单次节点,表示最多只执行一次子节点。

对于上述特殊控制节点,其对应的详细信息如表2所示。

表2

在表2所示的这些特殊控制节点下,若要实现上述提及的三个函数(get_start_node,get_next_node_true,get_next_node_false),其过程比较复杂。示例性地,并行节点的get_next_node_false求解中,在计算到最后一个子节点时,即使知道最后一个子节点执行失败,没有它前面的兄弟节点的执行结果的情况下,也是无法判断该并行节点是返回成功还是失败。或者,随机节点的get_start_node求解中,因为随机节点是随机选择一个子节点执行,所以在行为树优化时并不知道第一个执行的子节点是什么。

对于这些在优化过程中无法获得跳转链的特殊控制节点,在行为树优化的过程中需要跳过这些节点。以图4所示的并行节点为例,在进行行为树优化的过程中,首先将左下角的并行节点当成一个行为节点进行处理,然后获得第一层的跳转链;然后,对并行节点下的所有子树(subtree)进行递归处理,分别完成各子树下的跳转链的生成;最后,将所有子树下的跳转链组合在一起即完成整颗行为树的展开优化。

示例性地,选取h52非人学园项目中的近700颗行为树,分别执行每颗行为树1000次,记录该行为树的整体执行时间t1和其中行为节点函数执行时间t2,则控制节点函数的执行时间为t1-t2。其中,优化率可以定义为:(t1-t2)/t1。

同时,对于近700颗行为树中的每颗行为树,统计所有节点的数量c1和通用控制节点的数量c2,并将展开率定义为:c2/c1。

图5给出了优化率相对展开率的分布,其中,横坐标代表展开率,纵坐标代表优化率。参考图5,可以发现大部分的行为树的优化率都集中在80%左右。对所有的行为树的优化率求均值可得,相比优化前的控制跳转执行时间,优化后的控制跳转执行时间节省了18%左右。

下述为本发明装置实施例,可以用于执行本发明上述方法实施例,其实现原理和技术效果类似。

图6为本发明一实施例提供的行为树的执行优化装置的结构示意图。如图6所示,本实施例的行为树的执行优化装置60可以包括:获取模块61、分析模块62、构建模块63和执行模块64。其中:

获取模块61,用于读取一初始行为树执行文件,获取初始行为树执行文件相应的行为树中的控制节点函数。其中,行为树包括控制节点函数和行为节点函数。

分析模块62,用于分析控制节点函数,得到该行为树中行为节点函数的执行顺序。

构建模块63,用于根据行为节点函数的执行顺序,重新构建行为树执行文件。其中,该重新构建后的行为树执行文件中包含全部行为节点函数,重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数。

执行模块64,用于根据重新构建后的行为树执行文件执行行为树。

本实施例的行为树的执行优化装置,首先读取一初始行为树执行文件,获取初始行为树执行文件相应的行为树中的控制节点函数,该行为树包括控制节点函数和行为节点函数,之后,分析控制节点函数,得到行为节点函数的执行顺序,并根据行为节点函数的执行顺序,重新构建行为树执行文件,其中,重新构建后的行为树执行文件相应的行为树中包含全部行为节点函数,重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,根据重新构建后的行为树执行文件执行行为树。由于重新构建后的行为树执行文件相应的行为树中包含的控制节点函数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,去除了至少部分控制节点函数的执行,从而减少行为树在控制跳转上的执行时间,降低处理器资源开销。

上述实施例中,控制节点函数可以包括:涉及通用控制节点的控制节点函数;或者,涉及通用控制节点的控制节点函数和涉及特殊控制节点的控制节点函数。

在控制节点函数包括涉及特殊控制节点的控制节点函数时,重新构建后的行为树执行文件相应的行为树中也包含涉及这些特殊控制节点的控制节点函数。由于重新构建后的行为树执行文件相应的行为树中仅包含全部行为节点函数和涉及特殊控制节点的控制节点函数,去除了至少通用控制节点函数的执行,从而减少行为树在控制跳转上的执行时间,降低处理器资源开销。

可选地,通用控制节点可以包括以下至少一个:顺序节点、选择节点、声明成功节点、声明失败节点和声明取反节点等。其中:

顺序节点,表示顺序执行到其对应的子节点,直至一子节点返回失败;

选择节点,表示顺序执行到其对应的子节点,直至一子节点返回成功;

声明成功节点,表示执行其对应的子节点,并返回成功;

声明失败节点,表示执行其对应的子节点,并返回失败;

声明取反节点,表示执行其对应的子节点,并将其子节点的返回值取反。

可选地,特殊控制节点包括以下至少一个:并行节点、随机节点、乱序选择节点和单次节点等。其中:

并行节点,表示顺序执行其对应的所有子节点;

随机节点,表示随机选择其对应的一个子节点执行;

乱序选择节点,表示乱序执行其对应的子节点,直至其中一子节点反馈成功;

单次节点,表示最多只执行一次子节点。

作为一种可选方案,分析模块62可具体用于:

对于每一控制节点函数,获取控制节点函数对应的第一个执行的行为节点函数;

根据行为节点函数的父节点,确定行为节点函数执行成功或失败后下一个执行的行为节点函数,直至控制节点函数中所有行为节点函数执行完。

图7为本发明另一实施例提供的行为树的执行优化装置的结构示意图。如图7所示,本实施例的行为树的执行优化装置70包括:存储器71和处理器72。其中,存储器71和处理器72之间相互连接。

存储器71,用于存储程序指令。

当存储器71存储的程序指令被处理器72执行时,使得行为树的执行优化装置70执行如上述任一实施例所述的方法。

可选地,处理器72为cpu。

示例性地,行为树的执行优化装置70可以为服务端或终端。示例性地,服务端可以具体为服务器,终端例如是手机、平板等可运行单机游戏的设备。其中,服务器可以是一台服务器,或者由若干台服务器组成的服务器集群,或者是一个云计算服务中心,等等。

本发明实施例的行为树的执行优化装置,首先读取一初始行为树执行文件,获取初始行为树执行文件相应的行为树中的控制节点函数,该行为树包括控制节点函数和行为节点函数,之后,分析控制节点函数,得到行为节点函数的执行顺序,并根据行为节点函数的执行顺序,重新构建行为树执行文件,其中,重新构建后的行为树执行文件相应的行为树中包含全部行为节点函数,重新构建后的行为树执行文件相应的行为树中包含的控制节点函数的个数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,根据重新构建后的行为树执行文件执行行为树。由于重新构建后的行为树执行文件相应的行为树中包含的控制节点函数少于初始行为树执行文件相应的行为树中包含的控制节点函数的个数,去除了至少部分控制节点函数的执行,从而减少行为树在控制跳转上的执行时间,降低处理器资源开销。

本发明实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序可被处理器执行实现上任一实施例所示的方法,其具体实现及有效效果,可参见上述,在此不再赘述。

本领域普通技术人员可以理解:实现上述各方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成。前述的计算机程序可以存储于一计算机可读取存储介质中。该程序在执行时,执行包括上述各方法实施例的步骤;而前述的存储介质包括:只读内存(read-onlymemory,rom)、随机存取存储器(randomaccessmemory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

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