配置文件

在游戏工程中,通常有大量配置是由策划提供,再转换成程序方便读取的格式添加到工程中。

在我参与的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

通过观察可以发现其中有部分字段很容易重复,如:colorLvifUseuseNeedNum等, 这些字段通常为枚举或者有固定的分类,只有几个不同的值,然而配置表中每个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中的字段数量大幅缩减。

在实际生产中,这步优化被直接放在脚本中进行。在ExcelLua-Table的过程中直接完成。

缺点

可读性变差。开发人员人工检查时需要把数据对应的itemdefault__组合起来看才能得到当前item的数据。