时间触发器

  1. 背景
  2. 协议
  3. 循环定时器

背景

游戏中有许多内容是每天凌晨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

循环定时器

对于每小时执行函数, 起初的写法是计算出当前小时剩余时间, 之后直接定时一个小时. 但这种方法一旦有时间偏差就会一直存在, 还会将偏差积累下来

后面改成了每轮循环都要计算下当前小时剩余时间, 这样后面几轮即使有误差 也会被修正过来.