一种配置存储结构优化方法及系统
技术领域
本发明涉及一种配置存储结构优化方法及系统,属于计算机技术领域。
背景技术
一般游戏把固定配置的数据配置到Excel中,通过配表导出工具,把Excel的表数据导出到游戏能够直接读取使用的Lua配置。Lua是作为一个嵌入型脚本语言,由于其本身简单灵活的数据表达能力而游戏中常用于数据存储。
目前领域一般采取的流程如下:
1)策划配置Excel,通过导出工具导出Lua配置文件。
2)游戏中直接加载Lua配置文件到内存并使用。
通过上面的流程可以看出现有方案存在以下缺陷:
1)Lua配置仅仅是Excel的直接关系表现,而在游戏中往往需要存储更加复杂的数据关系,这个时候再去加载遍历数据再整合无疑也消耗了一部分不必要的性能。
2)导出的Lua配置没有做冗余数据优化,会存在大量重复的或没有意义的数据,从而导致Lua文件过大,而且也影响到了配置加载速度和增加了内存使用量。
3)每个配置表中难以避免大量中文字符串,后期要做本地化处理不好统一处理。
发明内容
为解决上述问题,本发明的目的在于提供一种配置存储结构优化方法及系统,通过建立新数据关联表,把游戏中需要使用的数据关联先建立起来存储到新Lua表;冗余数据替换处理以及中文字符串统一索引替换处理,把配置表中用到的中文字符串统一起来。
本发明解决其问题所采用的技术方案一方面是:.一种配置存储结构优化方法,其特征在于,包括:导出配置文件,得到原配置文件;读取原配置文件,获取所有的关联表数据信息,将数据关联信息另存为数据表,得到新建立的配置文件;对原配置文件和新建立的配置文件做冗余数据替换处理,其中包括对复合型数据重复的处理和简单字段值重复的处理;对原配置文件和新建立的配置文件做中文字符串统一索引替换处理;将处理后的原配置文件和新建立的配置文件作为配置文件使用。
进一步的,所述对复合型数据重复的处理包括:对以键值对形式存储的数据类型,将重复的数据抽离出来设置为局部表;将原重复引用的对象修改为指向局部表。
进一步的,所述简单字段值重复的处理包括:将重复的简单字段值写入到指定的局部默认值表中;修改原数据段的索引对象为局部默认值表中。
进一步的,所述做中文字符串统一索引替换处理包括:新建一张本地文本表,用于存储所有的中文字符串;对存储的中文字符串设置对应的索引ID键值;将使用中文字符串的数值修改为索引ID,其索引ID与本地文本表中存储的索引ID键值一一对应;通过索引ID和索引ID键值即可使使用中文字符串的数值定位到对应的中文字符串。
进一步的,所述将处理后的原配置文件和新建立的配置文件作为配置文件使用还包括将原配置文件和新建立的配置文件建立互相关联关系。
本发明解决其问题所采用的技术方案另一方面是:一种配置存储结构优化系统,其特征在于,包括:配置文件导出模块,用于导出配置文件,得到原配置文件;读取模块,用于读取原配置文件,获取所有的关联表数据信息;配置文件生成模块,用于将获取的数据关联信息另存为数据表,得到新建立的配置文件;配置文件处理模块,用于对原配置文件进行和新建立的配置文件做冗余数据替换处理;中文字符识别处理模块,用于对原配置文件和新建立的配置文件做中文字符串统一索引替换处理;配置文件整合模块,用于将处理后的原配置文件和新建立的配置文件作为配置文件使用。
进一步的,所述配置文件处理模块还包括:复合型数据处理模块,用于对目标配置文件执行复合型数据重复的处理;简单字段值处理模块,用于对目标配置文件执行简单字段值重复的处理。
进一步的,所述中文字符识别处理模块还包括:表格模块,用于新建一张本地文本表,用于存储所有的中文字符串;配置文件修改模块,用于将使用中文字符串的数值修改为索引ID;关联模块,用于将本地文本表中存储的中文字符串和配置文件中的索引ID通过新建索引ID键值来一一对应关联索引。
进一步的,还包括配置文件关联模块,用于将原配置文件和新建立的配置文件建立互相关联关系。
本发明的有益效果是:可以大量减少冗余和无意义的数据,从而减少了文件的大小,进而也提高了配置加载速度和减少内存大小、提高读取性能。
附图说明
图1所示为根据本发明较佳实施例的方法流程示意图;
图2所示为根据本发明较佳实施例的建立新数据关联表的流程示意图;
图3所示为根据本发明较佳实施例的游戏需要图;
图4所示为根据本发明较佳实施例的复合数据优化前后对比图;
图5所示为根据本发明较佳实施例的简单字段值优化前示意图;
图6所示为根据本发明较佳实施例的简单字段值优化后示意图;
图7所示为根据本发明较佳实施例的中文字符串优化前示意图;
图8所示为根据本发明较佳实施例的中文字符串优化后示意图;
图9所示为根据本发明较佳实施例的本地文本表示意图;
图10所示为根据本发明较佳实施例的系统结构示意图。
具体实施方式
以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。
需要说明的是,如无特殊说明,本公开中所使用的上、下、左、右等描述仅仅是相对于附图中本公开各组成部分的相互位置关系来说的。在本公开中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。
本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。
本技术方案是专门以lua语言作为配置表介绍优化的,Lua是一个小巧的脚本语言,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件。其他配置表也可以通过相同的方案去实现优化。
本方案是在Excel配置的数据通过导出工具导出Lua配置文件后,对配置做进一步的优化处理,优化处理步骤可以集成到导配置工具里也可以单独写一个后续自动化优化工具做处理。需要先对本身的配置建立新的数据关联表,然后再将原配置文件和新建立的配置文件统一进行冗余数据替换处理和中文字符串统一索引替换处理。最后处理完的配置就可以供游戏中直接使用。
参照图1所示为根据本发明较佳实施例的方法流程示意图,
本方案是在Excel配置的数据通过导出工具导出Lua配置文件后,对配置做进一步的优化处理,优化处理步骤可以集成到导配置工具里也可以单独写一个后续自动化优化工具做处理。需要先对本身的配置建立新的数据关联表,然后再将原配置文件和新建立的配置文件统一进行冗余数据替换处理和中文字符串统一索引替换处理。最后处理完的配置就可以供游戏中直接使用。
本方案结构主要分为三个部分:第一部分是建立新数据关联表概述;第二部分是冗余数据替换处理概述;第三部分中文字符串统一索引替换处理概述,是下面是各部分的具体描述。
第一部分:建立新数据关联表概述
Lua配置文件是用Table的形式存储和Excel一样的数据。可以把Table看成是键值对(key-value),一般在配置中会把Excel的第一列转化成配置索引Key,把Excel的每一行数据作为对应索引Key下的Value。索引Key往往是字符串或者数字,Value里可以是lua中的基本数据类型,包括string,number,table甚至是function。
然而这样导出的配置可以用索引Key找到对应的Value,但是游戏中往往会有更加复杂的索引需求,最常见的是通过A表索引到B表,再通过B表索引到C表,一个数据获取通过了多层索引才能够拿到,这无疑增加了许多读取性能消耗。Key-Value索引是通过hash查找值的,有时往往需要遍历整张表才能搜集到索引Key对应的Value值,这又大大增加了遍历对比的性能消耗,而这块往往是读取数据性能消耗的大头。
可以通过工具所有需要关联的表数据全部加载进来,然后建立新表存储新的数据关联信息,导出来也作为配置表使用。虽然需要新生成文件和占用部分内存,但是可以换来更好的读取性能,也方便提前做一些检查配置工具。建立新数据关联表的流程如图2所示:
建立新表存储数据内容是根据游戏需求来确定的,游戏需要用到一些新关联数据就可以在建立新表步骤插入新的导出关联数据的接口来实现。下面用游戏实际中用到的数据来举例:
图3是一张剧情树表,一个剧情关卡是一个剧情树,一个剧情树里有很多剧情节点,这个表的id索引就是剧情节点id,字段idGroup是剧情树id,所以id和idGroup是一对多的关系。561101这个id正常导出的数据结构是[561101]={idGroup=561000,name="完美后的三选",...}。但是在游戏里如果需要获取某个idGroup有多少个剧情节点,以往的做法就不得不遍历整张剧情树表,通过每一行对比idGroup来搜集数量信息,而这种表一般行数就有几千行甚至不止,这无疑大大消耗了不少性能。现在可以需求导出新表建立新的关联数据信息,数据结构是[561000]={561100,561101,561102,561103,561104,561105,561201,561301},这样直接在游戏中即可直接索引新表里对应idGroup来获取数量信息。
第二部分:冗余数据替换处理概述
配置表中一般存在大量重复的冗余数据,主要有一些复合型数据内容是一样还有一些简单字段值是重复的。下面将分这两个方面单独说明。
复合型数据重复
复合型数据指table类型的数据,可以将唯一化替换处理,即把重复的table抽离出来设置成局部表,然后原重复引用的地方都指向局部表。对于一张大表可以节省不少重复的复合型数据。比如现有一个表数据结构是{{1,"a"},{1,"a"}},这个表存在重复的表数据{1,"a"},于是先定义一个局部变量存储重复表local__rt_1={1,"a"},然后原表内容就可以直接引用重复表变量{__rt_1,__rt_1}。优化前后的数据如图4所示:
简单字段值重复
对于非复合型数据,很多字段值也存在大量重复的情况。一般情况下如果策划配置的重复值其实可以用来作为字段的默认值,这样就可以在不配置的时候读取字段默认值来实现优化。如果不把默认值配置在对应的表里,那么就得单独配置另外一个存放默认值的表,然而这样无疑导致了数据可读性比较差(因为把本来表的字段默认值配置到另外一个不相关的表里),而且也增加了策划配置新表的工作量。还有一种处理方式是直接让程序在代码里写死默认值,这种方式也导致代码可读性差和不易修改配置。这里采用将默认值还是配置到对应的表里,对于重复的数据通过工具把字段的默认值自动放到一个局部默认值表中,然后用lua里的metatable机制来索引到局部默认值表中即可。
在lua中,当通过键来访问table的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index键。如果__index包含一个表格,Lua会在表格中查找相应的键。当给表的一个缺少的索引赋值,解释器就会查找__newindex元方法:如果存在则调用这个函数而不进行赋值操作。简单来说__newindex元方法用来对表更新,__index则用来对表访问。
比如现有一个表数据结构是{{a=11,b="b"},{a=11,b="b",c="c"}},这个表的键a和b的值是重复的,于是定义一个局部默认值表local__default_values={a=11,b="b",c=""},然后原表内容就变成了非常简单的数据结构{{},{c="c"}},同时把原表内容的元表__index设置成局部默认值表。优化前的数据如图5所示,优化后数据如图6所示:
第三部分:中文字符串统一索引替换处理概述
游戏中每张配置表都存在大量的中文字符串,后期游戏做本地化处理要对每个配表做处理非常不方便,可以单独建立一张本地文本表存储所有的中文字符串,其他用到中文字符串的配表统一索引到本地文本表里。游戏中读取的时候通过索引id到本地文本表里获取文字字符串。这样本地化处理就只需要对本地文本表统一做处理即可,也方便外包出去给翻译人员配置。
比如现有一个表数据结构是{{a="配置优化"}},键a用到了中文字符串值,为a分配一个唯一的索引id,索引id自动化生成。同时在本地文本表里创建一行该索引id的键值即可。优化前的数据如图7所示,优化后的数据如图8所示,本地文本表如图9所示。
对应的系统结构如图10所示,包括:
配置文件导出模块,用于导出配置文件,得到原配置文件;
读取模块,用于读取原配置文件,获取所有的关联表数据信息;
配置文件生成模块,用于将获取的数据关联信息另存为数据表,得到新建立的配置文件;
配置文件处理模块,用于对原配置文件进行和新建立的配置文件做冗余数据替换处理;
中文字符识别处理模块,用于对原配置文件和新建立的配置文件做中文字符串统一索引替换处理;
配置文件整合模块,用于将处理后的原配置文件和新建立的配置文件作为配置文件使用;
配置文件关联模块,用于将原配置文件和新建立的配置文件建立互相关联关系。
配置文件处理模块还包括:
复合型数据处理模块,用于对目标配置文件执行复合型数据重复的处理;
简单字段值处理模块,用于对目标配置文件执行简单字段值重复的处理。
中文字符识别处理模块还包括:
表格模块,用于新建一张本地文本表,用于存储所有的中文字符串;
配置文件修改模块,用于将使用中文字符串的数值修改为索引ID;
关联模块,用于将本地文本表中存储的中文字符串和配置文件中的索引ID通过新建索引ID键值来一一对应关联索引。
应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。
此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。
进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的方法和技术编程时,本发明还包括计算机本身。
计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。
以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。