一张地图上 500 棵同款树,每棵存完整的模型数据——重复数据存 500 份。享元模式把不变的部分(模型、贴图)抽成共享的内部状态存一份,可变的部分(位置)作为外部状态随实例走——500 棵树只存 1 份模型加 500 个位置。共享的前提是分清"内部不变态"与"外部可变态"。
共享态获取。示例代码如下:
local shared = {}
local function getFlyweight(kind)
if not shared[kind] then
shared[kind] = { model = kind .. "_model",
texture = kind .. "_tex" }
end
return shared[kind]
end
local function placeTree(kind, x, y)
return { fly = getFlyweight(kind), x = x, y = y }
end
local t1 = placeTree("松树", 10, 20)
local t2 = placeTree("松树", 55, 80)
print(t1.fly == t2.fly)
输出 true——两棵松树共享同一份内部状态,位置各自独立。
装备词条接线。示例代码如下:
local defs = getFlyweight("裁决之杖")
print(defs.model)
同名装备的模型与基础属性全服共享一份,实例只存强化等级与归属——大型服务器的内存账。
500 棵树全量存储:每棵 2KB 模型数据共 1MB;享元后 1 份模型 2KB 加 500 个位置对 20KB,内存降 98%。查询共享态是一次哈希查找 O(1),比全量存储的读取慢不到 5%——内存省 98%、速度几乎无损。
三个不适用场景:一是对象几乎没有重复(每件装备词条独一无二),共享无对象可享;二是可变部分占对象体积的九成以上,抽离内部状态的收益微薄;三是内部状态需要按实例微调(同款树不同颜色),共享粒度对不上需求。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、隐蔽陷阱 对比两份任务记录的"共同路线":要求连续的子串可以逐位比对,允许跳过中间步骤的最长公共子序列却没法直…
【游戏】 一、业务场景 新玩家出门就挨打,图文教学没人看,第二天流失率居高不下。训练营上线:三个分阶关卡(走位、连招、节奏)…
【语法】 一、隐蔽陷阱 五只猴子分桃,每来一只把桃分成 5 份多 1 个扔掉再拿走一份。正向从 1 个桃开始试,试到几千个才…
【游戏】 一、业务场景 满级玩家装备毕业后一周流失,进度条走到头没了盼头。渡劫玩法上线:80 级可挑战三重天劫,全通获得渡劫…
【语法】 一、隐蔽陷阱 63 分找零用面额 1、5、10、25 的硬币,贪心取最大面额 6 枚搞定;可换成面额 1、3、4 …
【游戏】 一、业务场景 会长每天手动发福利、清名单、盯报名,帮务占满游戏时间,连着三周漏发福利被帮众催。帮会管家上线:每周 …