lua配置表优化
前不久发现项目里的Lua配置表有不少配置项都是重复的,虽然这些重复项几乎不会影响游戏在运行时的内存大小(Lua中同一字符串在内存中只会存在一份),但是却会增大配置文件的大小。
想到可以利用lua的元表metatable去除这些重复的冗余数据,大致步骤如下:
- 统计原有配置表tableA中每个键值对出现的次数,若某个键值对的重复次数大于N,将其加到一个新的tableB中。
- 删去tableA中同时也在tableB中的重复键值对。
- 将tableB作为tableA的__index元表。这样一来,当试图访问tableA中不存在的元素时,会首先到tableB中查找,从而获取到"默认"配置。
Sheet = {}
Sheet[1]={["b"]="2",}
Sheet[2]={["c"]="2",}
Sheet[3]={["c"]="0",}
Sheet[4]={}
Sheet[5]={["c"]="1",}
local metatable = {
["a"]="1",
["c"]="3",
["b"]="",
["a"]="",
["b"]="0",
}
for i, v in pairs(Sheet) do
setmetatable(v, {__index = metatable})
end
当Lua表中重复的配置项比较多时(比如大于1000项),这种方法能够有效减少配置表文件的大小(实际应用下来大约减小了30%)。