游戏开发:阶段排期管理器

常有的业务需求场景是一个配置自然时间的多阶段玩法。这里讨论阶段管理逻辑的实现方案。

实现一个排期管理模块,应该解决的问题有:

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)异常中断处理:有限状态机

posted @ 2024-03-23 20:25  linxx-  阅读(12)  评论(0编辑  收藏  举报