【游戏】
一、规则机制
抛坑提问:控件缓存收进了各种类型的控件,出库时能不能保证拿到的就是想要的类型?分池管理给出结构:按控件的配置标识分组,每组一条独立池子;出库从对应池尾弹一个,池空才新建;入库按同样的标识归池。源码的缓存管理器就用一张分组表管理所有池子,取与还都在自己的池子里进行,类型永不串门。
二、错误写法
-- 错误:一个池存所有类型,出库类型乱串
pool[#pool + 1] = widget
三、正确写法
local pools = {}
local function acquire(kind, createFn)
pools[kind] = pools[kind] or {}
local w = table.remove(pools[kind])
if w == nil then
w = createFn()
end
return w
end
local function release(kind, w)
pools[kind] = pools[kind] or {}
table.insert(pools[kind], w)
end
四、边界处理
出库从池尾弹,池空新建;入库按标识归池;不同标识的池互不混用。
五、FAQ
问:为什么要按类分池?
答:保证出库即所需类型,免去二次校验。
问:池会无限膨胀吗?
答:常驻复用不膨胀,场景切换可整池清空。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法算法】 元方法 __len 的触发就这一行: 对带 __len 的表做 t 操作时,Lua 调用 __len 而不是返…
【语法算法】 load 的编译本质就这一行: load 把字符串编译成函数——字符串里的代码被编译成可调用的函数——调用返回…
【语法算法】 error 的传播本质就这一行: error 抛出一个错误——第二个参数指定错误信息的层级——层级 2 表示把…
【语法算法】 pcall 的保护调用本质就这两行: pcall 把函数包在保护壳里执行——函数内部报错不会传播到外层——ok…
【语法算法】 元方法 __tostring 的触发就这一行: 对带 __tostring 的表做 tostring(t) 或…
【语法算法】 元方法 __call 的触发就这一行: 对带 __call 元方法的表做函数调用 t(...) 时,Lua 不…