在游戏开发中,需要用到大量且更新不频繁的配置数据,而把业务拆分到多个服务后,各个服务可能只用到其中的少部分数据,此时每个服务加载所有数据会浪费大量内存。sharedata模块就是为了解决这种需求设计的,其原理是:将共享lua数据存放到一个c结构里,所有服务都共享这个c结构的内存块,各个服务可以获取这个共享内存对象,然后就可以像读取普通lua表一样读取数据。
1. 创建共享数据
调用sharedata.new(name, value) api创建共享数据对象,主要2个参数:name,名字;v,可以是一张lua table,也可以是lua文本代码,也可以是lua文件,最终都会转化成一个table,然后调用c层接口(第15行)返回一个c结构共享内存,共享内存用引用计数管理其生命周期。
-- lualib/skynet/sharedata.lua
function sharedata.new(name, v, ...)
skynet.call(service, "lua", "new", name, v, ...)
end
function CMD.new(name, t, ...)
local dt = type(t)
local value
...
newobj(name, value)
end
local function newobj(name, tbl)
assert(pool[name] == nil)
local cobj = sharedata.host.new(tbl)
sharedata.host.incref(cobj)
local v = { value = tbl , obj = cobj, watch = {} }
objmap[co