一种采用包机制的lua脚本文件管理方法技术领域
本发明涉及一种脚本语言,尤其是一种采用包机制的lua脚本文件管理方法。
背景技术
在网络游戏的服务器端和客户端,通常需要应用到lua脚本技术。这些lua代码,通常分布在大量的lua脚本中,因此这些lua脚本就需要一个机制来进行管理。这个机制需要满足以下需求:
1.能够管理多个lua脚本,这些lua脚本都必须加载在同一个lua虚拟机里以便进行通讯;
2.不同lua脚本之间的既需要能够互相通讯又必须保持一定的独立性。
lua本身提供了一定的机制来管理多个lua脚本文件,但它却有着比较严重的局限性导致不能直接在游戏产品中直接使用:
1.lua自身虽然提供了模块(module)机制,可以保证一个脚本文件加载一次,但不同的文件的同名对象会相互冲突;
2.不同的文件之间没有一个明显的关联关系,不利于程序逻辑关系的组织。
发明内容
为克服以上所述的缺陷,本发明实现了一种lua虚拟机的管理方法,对现有的lua虚拟机进行改造,可以灵活高效地管理大量lua脚本文件。
本发明为此提出了一种采用包机制的lua脚本文件管理方法,其包括作为程序中对象名字的容器的包,每个不同的lua脚本文件对应于一个包,每个包分配有一独有标识(ID),每个包均具有用于保存当前包所包含的包的ID的父(parents)表以及用于保存当前包所引用到的对象的名字的名字表,所述包被进一步设置为:包之间相互独立,并通过特定的应用程序界面(API)在包之间建立称为包含(include)的单向联系,一个包可以被多个包所包含,也可以包含多个包,但一个包只知道自己包含了那些包,而不知道自己被那些包所包含;
所述方法还包括有全局包,其被配置为不需要被包含即自动为其他所有包可见;
所述方法还包括有统一的lua脚本文件名字到包的包表,用于对包进行检索;
所述方法还定义了以下脚本文件加载流程:
1)查找需加载的脚本文件是否在包表中,如是则跳到到6),如否则继续下一步;
2)新建包,并分配ID加入包表;
3)检查是否包含有其它包,如否则跳到6),如是则继续下一步;
4)加载被包含的包;
5)将被包含的包加入当前包的parents表;
6)加载脚本文件。
作为以上技术方案的一种改进,所述方法还引入了全局包,所述全局包被配置为不需要被其它包所包含即自动为其他所有包可见。
作为以上技术方案的一种改进,所述方法包括以下文件名查找步骤:
1)先在当前包中的名字表中查找,找到则结束查找,否者继续下一步;
2)在全局包中查找,找到则结束查找,否者继续下一步;
3)依次对parents表所引用的包的名字表进行查找。
作为以上技术方案的一种改进,其中查找采用先深搜索的遍历规则。
相对于现有技术,本发明所提出的lua脚本管理方法具有以下优点:
1.lua脚本文件都加载在同一个lua虚拟机里,保证了内存使用效率和执行效率;
2.不同的lua脚本文件相互独立,不同文件里的同名对象不会互相冲突;
3.不同的lua脚本文件可以通过特定机制共享数据进行通讯;
4.虽然对lua虚拟机进行了改造,但是在语法层面仍然保持兼容性。
附图说明
下面结合附图和实施例对本发明进一步说明。
图1为本发明中包的相互关系的示意图;
图2为本发明中包的结构组成的示意图;
图3为本发明中脚本文件加载流程的示意图。
具体实施方式
本发明的技术方案利用一种包机制来管理每个lua脚本文件,每个不同的lua脚本文件对应于一个包,其中包为一种程序中对象名字的容器,而对象则为程序中数据结构或者函数的实体。每个包用一个数字来标识(ID),在一个优选的实施例中,包的标识为一个大于等于0的整数,即从数字1开始递增。
每个包都有自己独立的名字空间,即对象名字和对象的映射表。本发明还包括有一个统一的文件名到包的包表,其是一种key-value类型的映射表,用于脚本文件名到对应的包的映射,在本发明中用于对包进行检索。
在本发明中,包被配置为相互独立,但可以通过特定的应用程序界面(API)在包之间建立单向联系,这个单向联系称为包含(include)。也即是说,include是包与包之间的一种单向联系的称呼,也是建立这种连接所用API名字。具体来讲,如果包B 包含(include)了包A,则包A的对象为包B可见;但不能同时建立反向联系,即如果包B 包含了包A,则不允许包A包含包B。一个包可以被多个包所包含,也可以包含多个包。但一个包只知道自己包含了那些包,而不知道自己被那些包所包含。具体如图1所示。
另外,本发明还包括有一个特殊的全局包,数字标识为0,不需要被其它包所包含即自动为其他所有包可见。
具体来说,每个包中均具有有两种主要数据结构:
1.父(parents)表:一种被包所用到集合表,成员是被当前包所Include的包的ID,在本发明中用于保存当前包所包含的包的ID;
2.名字表:一种key-value类型的映射表,用于对象名字到对象的映射,在本发明中用于保存当前包所引用到的对象的名字。
其具体结构如图2所示。图3显示了根据本发明的脚本文件加载流程,其步骤包括:
1)查找需加载的脚本文件是否在包表中,如是则跳到到6),如否则继续下一步;
2)新建包,并分配ID加入包表;
3)检查是否包含有其它包,如否则跳到6),如是则继续下一步;
4)加载被包含的包;
5)将被包含的包加入当前包的parents表;
6)加载脚本文件。
lua在执行时需要根据名字来获取对应的对象,这个过程被称为名字查找。在本发明中,在本发明中lua脚本文件名字的查找通过以下步骤实现:
1.先在当前包的名字表中查找,找到则结束查找;
2.在全局包中查找,找到则结束查找;
3.依次对parents表所引用的包的名字表进行查找,找到则结束查找。
其中查找的遍历规则为先深搜索,或称为深度优先搜索。
这样,相对于现有技术,本发明所提出的lua脚本管理方法具有以下优点:
1.lua脚本文件都加载在同一个lua虚拟机里,保证了内存使用效率和执行效率;
2.不同的lua脚本文件相互独立,不同文件里的同名对象不会互相冲突;
3.不同的lua脚本文件可以通过特定机制共享数据进行通讯;
4.虽然对lua虚拟机进行了改造,但是在语法层面仍然保持兼容性。
当然,本发明除了上述实施方式之外,其它等同技术方案也应当在其保护范围之内。