背景
游戏中有许多内容是每天凌晨0点更新, 有些玩法是每天0点都会更新, 有的则需要累积到一定天数才会更新, 累计的天数则是需要进行配置.
设计一个通用的配置Proto用来统一配置格式, 触发器模型就可以读取这些统一的配置 统一进行天数判断.
对于每天0点都会更新的, 每天触发一次. 对于累计天数的, 累计天数达到后进行触发.
触发的时候不主动调用业务代码, 而是采用发布指定事件的方式进行通知.
协议
enum TimeTriggerGamePlay
{
TIME_TRIGGER_GAME_PLAY_NONE = 0;
TIME_TRIGGER_GAME_PLAY_NORMAL = 1;
TIME_TRIGGER_GAME_PLAY_REDOUBT = 2;
}
enum TimeTriggerType
{
TIME_TRIGGER_DEFAULT = 0;
// 每小时触发
// TIME_TRIGGER_EVERY_HOUR = 1;
// 每天触发
// TIME_TRIGGER_EVERY_DAY = 2;
// 累计天数触发 从阶段1开始, 阶段2, 阶段3..
TIME_TRIGGER_DAY_ACCUMULATE = 3;
}
message TimeTriggerConfigItem
{
// 所属玩法
TimeTriggerGamePlay trigger_game_play = 1;
// 触发器类型
TimeTriggerType trigger_type = 2;
// 进入新阶段开服天数
repeated int32 trigger_accumulate_day = 3;
// 是否启用
bool is_enable = 4;
}
message TimeTriggerConfig
{
repeated TimeTriggerConfigItem trigger_config_item = 1;
}
message TimeTriggerMsg
{
// 所属玩法
TimeTriggerGamePlay trigger_game_play = 1;
// 触发器类型
TimeTriggerType trigger_type = 2;
int32 now_hour = 3;
int32 now_stage = 4;
}
触发器
enum CoreEventMainType
{
CEVENT_MT_TIME_TRIGGER
}
enum CoreEventSubType
{
CEVENT_ST_TIME_TRIGGER
}
// TimeTriggerMsg
循环定时器
对于每小时执行函数, 起初的写法是计算出当前小时剩余时间, 之后直接定时一个小时. 但这种方法一旦有时间偏差就会一直存在, 还会将偏差积累下来
后面改成了每轮循环都要计算下当前小时剩余时间, 这样后面几轮即使有误差 也会被修正过来.