关于新增定时器的扩展 整点报时

前言

对于游戏来说,经常有一些跨天整点的活动,比如英雄联盟手游的峡谷之巅每天12点到0点开放。做这种功能就需要分别在每天的12点和0点触发事件调用。

如何新增

一开始想在timer.lua去新增一些新增一些方法,但是想保持timer.lua足够简单,就独立了一个文件用继承的方式来扩展。

提供功能

可以像设置闹钟一样设置。

  • 设置每分钟的哪一秒。
  • 设置每小时几分几秒。
  • 设置每天的几时几分几秒。
  • 设置每周的周几几时几分几秒。
  • 设置每月的第几天几时几分几秒。
  • 设置每年的几月几天几时几分几秒。
  • 设置每年的几天几时几分几秒。

特殊处理

当月或者当年没有该天适配到最后一天。

代码设计模式

因为每个类型需要设置的参数都不一样,然后参数又较多,就使用了建造者模式,这样构造代码更易读一些。

调用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

local ti_12 = timer_point:new(timer_point.EVERY_MINUTE):set_sec(10):builder(function()
log.error("每分钟:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

local ti_13 = timer_point:new(timer_point.EVERY_HOUR):set_min(5):set_sec(20):builder(function()
log.error("每小时:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

local ti_14 = timer_point:new(timer_point.EVERY_DAY):set_hour(6):set_min(5):set_sec(20):builder(function()
log.error("每天:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

local ti_15 = timer_point:new(timer_point.EVERY_WEEK):set_wday(1):set_hour(6):set_min(5):set_sec(20):builder(function()
log.error("每周:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

local ti_16 = timer_point:new(timer_point.EVERY_MOUTH):set_day(1):set_hour(6):set_min(5):set_sec(20):builder(function()
log.error("每月:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

local ti_17 = timer_point:new(timer_point.EVERY_YEAR):set_month(1):set_day(1):set_hour(6):set_min(5):set_sec(20):builder(function()
log.error("每年:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

local ti_18 = timer_point:new(timer_point.EVERY_YEAR_DAY):set_yday(1):set_hour(6):set_min(5):set_sec(20):builder(function()
log.error("每年第几天:",os.date("%Y%m%d-%H:%M:%S",time_util.time()))
end)

快进时间

这种以天为单位触发的任务,不太好测试,需要增加快进时间的测试手段,修改了skynet源码并提交了requests,如果云大不合并的话,以后skynet_fly submodule指向自己的fork版本算了。

快进时间修改过程

刚开始天真的以为修改一下skynet_time.c的get_time就行了,但是仅改动get_time,增加加速时间,相当于直接从A时间跳到B时间,而A时间到B时间过程中的定时器任务可能还没有执行,时间却在加速流逝,这是因为skynet的timer线程只负责流逝时间和触发定时器任务,触发后加入到对应ctx的消息队列,由work线程消费,timer线程和work线程是同步执行的。
如果我们起了一个每分钟执行一次的定时任务。如果加速时间从11点到12点,完全看timer在流逝过程中,work线程的处理速度,大概率不能执行60次,所以需要把这个加速过程串行处理才行。

总结

skynet_fly新增定点触发的定时器,扩展定时器的功能,使得skynet_fly可以为游戏开发提供更便捷的工具。

skynetfly源码地址


关于新增定时器的扩展 整点报时
https://huahua132.github.io/2023/10/22/skynet_fly_ss/time_point/
作者
huahua132
发布于
2023年10月22日
许可协议