导出配置_Lua配置表导出优化

随着游戏的开发,项目的配置表数据越来越多,占用的内存越来越;配置表占用太大就会影响游戏加载速度,游戏流畅度的每一毫秒都是我们的必争之路。

	[1] = {DungeonID=10000, Dungeon= "王进打高俅", NextDungeonID=10100, BattleID= {10001, }, BattleTime=0, Quality=0, BackMusic= "BGM_Fight", },[2] = {DungeonID=10100, Dungeon= "鲁提辖,拳打镇关西", NextDungeonID=10200, BattleID= {10101, 10102, }, BattleTime=0, Quality=0, BackMusic= "BGM_Fight", },[3] = {DungeonID=10200, Dungeon= "五台山,僧与俗的较量", NextDungeonID=10300, BattleID= {10201, 10202, 10203, 10204, 10205, 10206, 10207, 10208, }, BattleTime=0, Quality=0, BackMusic= "BGM_Fight", },

我们项目采用的配置表存储方式是Lua表格,策划配表用excel配置,然后使用网上的开源工具excel2lua导出lua表格,业务逻辑使用的时候直接import表就好了。在观察了导出的lua表格后,我们整理出一堆待优化的问题

1. 没有意义的空值(比如0,[]等)
2. 重复数据
3. 默认值
4. 字段名优化
5. 客户端、服务端表格分离

搞清楚了数据冗余的原因,我们就可以制定优化方案:

没有意义的空值(比如0,[]等)

空的table:我们建了一张全局表GlobelEmptyTable = {},然后把这些空table都指向这个GlobelEmptyTable

重复数据

对于重复数据,我们在lua表新建一张duplication表,用来存放重复数据,然后把重复的数据,都指向这张表里面相应的重复的数据。

默认值

通过观察可以发现其中有部分字段很容易重复,如:BattleTime、Quality等, 这些字段通常为枚举或者有固定的分类,只有几个不同的值,然而配置表中每个item都需要为这些内容创建一个字段。
我们的优化方案是,利用lua的特性--原表(metatable),建一张defaultValues表,在导出的时候,选取出现次数最多的值作为每个字段的原表,存到defaultValues,然后剔除每行中与默认值相同的字段,从而节省内存。
local defaultValues = {Dungeon = "",Describe = "",PlayerLevel = 0,Name = "",NeedStar = 0,BackMusic = "BGM_Fight",PrizeInfo = 0,Crime = "",Num = 1,Place = "",BattleID = gConstEmptyTable,BackGround = "",NextDungeonID = 0,DungeonID = 0,ID = 0,
}dolocal base = {__index = defaultValues, --基类,默认值存取__newindex = function()--禁止写入新的键值error("Attempt to modify read-only table")end}for k, v in pairs(DUNGEON_LIST) dosetmetatable(v, base)endbase.__metatable = false --不让外面获取到元表,防止被无意修改
end

字段名优化

热心网友给我提出这种优化,但是这种类似CSV存储格式,可想而知,内存肯定可以降低很多,我简单实现了一下,比对了一下内存,差别还是很大的!!!但是这种存储格式和默认值方案冲突,只能取舍,现在项目已经做完了,下个项目可以试一下这种方案。

608e462337078223b23e9d3c51321f32.png
修改前

93a467b52a328fe4b44461ff472812e7.png
修改后
local KeyMap = {costRes = 1,costTime = 2,troopsCount = 3,power = 4,model = 5,
}local BUILD101 = {[1] = {{}, 0,  2, 69, "castle1", },[2] = {{ 1001, 1782, 1002, 2430, 1003, 2430, 1004, 1458, }, 295, 2, 166, "castle1", },[3] = {{ 1001, 2673, 1002, 3645, 1003, 3645, 1004, 2187, }, 1080, 2, 302, "castle1", },
}dolocal base = {__index = function(table,key)local keyIndex = KeyMap[key]if not keyIndex thenprint("key not found: ",key)return nilendreturn table[keyIndex]end, --基类,默认值存取__newindex = function()--禁止写入新的键值error("Attempt to modify read-only table")end}for k, v in pairs(BUILD101) dosetmetatable(v, base)endbase.__metatable = false --不让外面获取到元表,防止被无意修改
end

客户端、服务端表格分离

服务器对于这么点内存,根本不会在意,但是客户端大不一样,是个精打细算的好媳妇,每一KB都要计较的,所以,我们设计一个参数来控制配置表导出对象,C:客户端、S:服务端,在和策划设计表的时候,告知哪些是客户端需要的参数,导出的时候,按C、S导出2张表。

本文中使用的配置表优化工具源码已经放在github,需要的朋友可以自取:)https://github.com/Aver58/Tools

使用元表优化 Lua 配置文件​www.orztu.com
683418146ddf896ee4dad96088c71ccd.png
Lua配置表存储优化方案 - UWA Blog​blog.uwa4d.com
7f1bd9dd953cba66d8863edbe3945d8b.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376170.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS数据存取---iOS-Apple苹果官方文档翻译

本系列所有文章,链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) 本文对应pdf文档下载链接,猛戳—>:数据存取文档.key.zip3.1 MB数据存取文档.pdf1.1 MB 数据存取/*技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://w…

企业QQ 增加在线交谈链接

企业QQ的在线交流链接跟普通QQ的在线交流不一样&#xff0c;普通QQ的在线交流&#xff0c;可以在http://shang.qq.com/v3/widget.html生成&#xff1b;企业qq的链接可以按以下步骤添加&#xff1a;第一步&#xff1a;引入企业QQjs脚本&#xff1a;<script charset"utf-…

为什么打不开_发票查重百科导出的发票台账为什么附件打不开?

1在扫描完发票之后&#xff0c;很多人都习惯性的定期将扫描的电子发票台账导出来&#xff0c;目前电子发票查重工具小程序版提供了两种导出方式&#xff1a;通过邮件的方式将指定日期内的发票台账直接发送到指定的邮箱&#xff1b;直接将指定日期内的发票台账下载到手机上进行查…

无法找到脚本文件 C:/Windows/explorer.exe:574323188.vbs

今天打开电脑后电脑有点反常&#xff0c;在启动时没有运行 “局域网” 保护的程序&#xff0c;而且还他是 “无法找到脚本文件”如下图&#xff1a; 发现这个东西后&#xff0c;第一反应&#xff0c;拔掉网线、因为很有可能是中病毒了&#xff0c;当时就出了一身冷汗&#xff0…

【转】成功的程序员

我算是靠坑蒙拐骗进了程序员的门&#xff0c;然后一路狂奔。26 岁之前几乎没有任何写代码的经验&#xff0c;研究生毕业却意外选择了一家不可能提供培训的初创公司&#xff0c;在每日担忧公司倒闭、害怕被炒鱿鱼以及同事冷落白眼的三重压力下逆流而上&#xff0c;一年半后离职&…

requests 分类多级页面_scrapy框架爬取多级页面

spides.py# -*- coding: utf-8 -*-import scrapyfrom weather.items import WeatherItemfrom scrapy.crawler import CrawlerProcessimport re多级分类爬取class IgxSpider(scrapy.Spider):name igx_resultallowed_domains [www.igxpt.com]# start_urls [http://www.igxpt.c…

T-SQL:SQL Server-数据库查询语句基本查询

ylbtech-SQL Server-Basic:SQL Server-数据库查询语句基本查询SQL Server 数据库查询语句基本查询。 1&#xff0c;数据库查询语句基本查询数据库SQL ServerOracle基本语句 select select * from titles select title_id,title,price,pub_id from titles select * from title …

C:打印菱形(自己的方法)

//-------------------&#xff0a;打印菱形&#xff0a;--------------------- int i,j,k; int n; printf("请输入一个奇数n&#xff1a;"); scanf("%d",&n); for (i0; i<n/2; i) { for (j0; j<n/2-i; j) { printf(" "); } for (k0; …

修改无效_修改劳动合同日期被认定无效,青岛一企业被判赔双倍工资

劳动合同法规定&#xff0c;用人单位超过一个月不满一年未与劳动者订立书面劳动合同的&#xff0c;应当向劳动者每月支付二倍的工资。在现实中&#xff0c;经常遇到的情况是续签合同时&#xff0c;已经到期的劳动合同与新合同之间的空档期&#xff0c;如果管理混乱或者遇到特殊…

HDUOJ-----2065红色病毒问题

"红色病毒"问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3339 Accepted Submission(s): 1422 Problem Description医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相…

下拉框_jQuery 美化界面的下拉框

插件简介之前我们介绍过一款基于jQuery多级联动美化版Select下拉框&#xff0c;很多朋友都非常喜欢&#xff0c;可见经过美化过的下拉框的确可以让你的网页更为精妙。今天我们要介绍的这款美化界面下拉框也是基于jQuery的&#xff0c;它的特点是可以通过上下箭头微调选择&#…

字体缩放 SignedDistanceField

Unity中如果使用位图字体&#xff0c;在缩放较大的情况下&#xff0c;字体失真严重&#xff0c;使用矢量字体可能会存在内存过大的情况。 Signed Distance Field Font Rendering将字体保存在图片内&#xff0c;但是图片存储的并不是像素&#xff0c;而是距离&#xff0c;再通过…

【转】SQL删除重复数据方法

例如&#xff1a; id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c …

python批处理栅格转点_python获取栅格点和面值的实现

1、获取指定位置的点值&#xff1a;OutputFile open(statisticResultTXT, w)cellvaluearcpy.GetCellValue_management(inputfilepathfilenname".tif",staionXY, "1")OutputFile.write(stationID"_"filenname""str(cellvalue)\n)Outpu…

看看别人的演讲

淘宝&#xff1a;http://www.w3cmark.com/2014/137.html 转载于:https://www.cnblogs.com/gaoxue/p/4330728.html

jsp中获取WebContent路径

方法一&#xff1a; 1 <script type"text/javascript" src"../js/data.js"></script> 方法2&#xff1a; 1 <% 2 String path request.getContextPath(); 3 String basePath request.getScheme()"://"request.getServerName()&…

layui文本框填充值_layui输入框中只允许输入整数的实现方法

如下所示&#xff1a;//转化正整数function zhzs(value){value value.replace(/[^\d]/g,);if(!value){value parseInt(value);}return value;}其他的正则function clearNoNum(obj){obj.value obj.value.replace(/[^\d.]/g,""); //清除“数字”和“.”以外的字符ob…

YQL获取天气

$(function () { $.getJSON("http://query.yahooapis.com/v1/public/yql?callback?", { q: "select * from json where urlhttp://m.weather.com.cn/data/101210101.html", format: "json" }, function (data) { if (data.query.results) { v…

如何判断平台工具集去做条件编译(VC++目录、预处理器定义、$(PlatformToolsetVersion))...

作者&#xff1a;zyl910 从VS2010开始&#xff0c;提供了一个平台工作集&#xff08;Platform ToolSet&#xff09;选项用于配制vc编译版本。到了VS2012&#xff0c;更是因为默认平台工具集不支持WindowsXP&#xff0c;导致经常需要切换到xp版平台工具集&#xff0c;VS2013也是…

gerber文件怎么导贴片坐标_利用Gerber文件生成贴片坐标及元件位置图的方法技巧...

利用Gerber文件生成贴片坐标及元件位置图的方法技巧利用Gerber文件生成贴片坐标及元件位置图的方法技巧2010-10-11 21:59Gerber文件是所有电路设计软件都可以产生的文件&#xff0c;在电子组装行业又称为模版文件(stencil data),在PCB制造业又称为光绘文件。可以说Gerber文件是…