使用元表优化 Lua 配置文件
配置文件
在游戏工程中,通常有大量配置是由策划提供,再转换成程序方便读取的格式添加到工程中。
在我参与的Cocos2dx-Lua
工程中,策划通常在Excel
中配置,再通过脚本转换为Lua-Table
的文件。
比如常见的道具表转换后:
-- PropModel.lua
PropModel = {
[1001] = {
ID = 1001,
name = "道具1001",
desc = "道具1001描述",
colorLv = 1, -- 颜色等级
ifSell = true, -- 是否可以出售
ifUse = true, -- 是否可以使用
useExtraStr = "", -- 使用时额外消耗的资源
useNeedNum = 1, -- 使用消耗数量
maxNum = 99, -- 最大堆叠数量
...
},
[1002] = {
ID = 1002,
name = "道具1002",
desc = "道具1002描述",
colorLv = 1, -- 颜色等级
ifSell = true, -- 是否可以出售
ifUse = true, -- 是否可以使用
useExtraStr = "", -- 使用时额外消耗的资源
useNeedNum = 1, -- 使用消耗数量
maxNum = 99, -- 最大堆叠数量
...
},
...
}
Excel
配置中每一行数据经过转换后对应Lua-Table
的一个item
。
通过观察可以发现其中有部分字段很容易重复,如:colorLv
、ifUse
、useNeedNum
等,
这些字段通常为枚举或者有固定的分类,只有几个不同的值,然而配置表中每个item
都需要为这些内容创建一个字段。
优化
有了这些重复的字段,就给了我们优化的空间。
通过使用Lua
的元表,可以让每个item
拥有共同的字段而非每个item
去创建一个字段。
从而节省内存开销。
如优化之后:
PropModel = {
[1001] = {
ID = 1001,
name = "道具1001",
desc = "道具1001描述",
...
},
[1002] = {
ID = 1002,
name = "道具1002",
desc = "道具1002描述",
...
},
...
}
-- 将重复内容提取为默认item
local default__ = {
colorLv = 1,
ifSell = true,
ifUse = true,
useExtraStr = "",
useNeedNum = 1,
maxNum = 99,
}
local base = {
__index = default__,
}
for _, v in pairs(PropModel) do
setmetatable(v, base)
end
这样为每个item
设置元表后,item
中的字段数量大幅缩减。
在实际生产中,这步优化被直接放在脚本中进行。在Excel
到Lua-Table
的过程中直接完成。
缺点
可读性变差。开发人员人工检查时需要把数据对应的item
和default__
组合起来看才能得到当前item
的数据。