前言
对于游戏来说,经常有一些跨天整点的活动,比如英雄联盟手游的峡谷之巅每天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源码地址