常有的业务需求场景是一个配置自然时间的多阶段玩法。这里讨论阶段管理逻辑的实现方案。
实现一个排期管理模块,应该解决的问题有:
state object:抽象出object原型描述单个阶段的属性,提供 [query, set] API;
local object = {
_st, -- 阶段号
_bt, -- 阶段开启时间戳
_et, -- 阶段结束时间戳
_bcmd, -- 阶段开始handler name
_ecmd, -- 阶段结束handler name
}
state manager:抽象阶段管理object原型负责组织管理所有相关state object的逻辑;
local object = {
id, -- 管理器ID
list, -- state object list
initing, -- 初始化ing状态
}
1)阶段管理器以原型给出,支持独立的上下文;
driver:排期管理驱动器,提供定时心跳触发阶段检查和数据检验;
local object = {
id, -- 排期ID
db, -- 存盘数据
st2cmd, -- 排期配置
mgr, -- 阶段管理器object
ctx, -- 玩法上下文
}
1)驱动器以原型给出,支持独立的上下文,与外部玩法解耦,每个驱动器object持有外部玩法ctx,通过ctx[cmd]的方式调用到特定玩法的业务逻辑;
2)驱动器支持数据进行读写存盘;
3)驱动器启动参数:阶段ID对应处理cmd信息;
--[[
@@param:
bt : 阶段开启时间戳
et : 阶段结束时间戳
bcmd : 阶段开启处理handler name
ecmd : 阶段结束处理handler name
--]]
st2cmd = {
"signup"= { bt = xxxx, et = xxx, bcmd = xxx, ecmd = xxx },
"group" = { bt = xxxx, et = xxx, bcmd = xxx, ecmd = xxx },
-- ...
}
4)核心检查逻辑:比对当前所处阶段和预期应在阶段,当阶段不相等时,触发阶段切换。逻辑确保有序地切换到定义的下一阶段,直到到达期望应在的阶段,每次心跳回调只执行单次切换;
5)心跳回调碰撞处理:心跳handler需要处理两次心跳触发之间相互碰撞的问题,避免逻辑被多次执行引发异常。方案是模拟加锁操作,在回调入口检查如果已被lock住则本次回调直接返回,否则标记lock并执行,完成后标记unlock退出;
6)异常中断处理:有限状态机
标签:object,管理器,游戏,--,排期,阶段,xxx From: https://www.cnblogs.com/linxx-/p/18091632