游戏开发中的定时器

面临问题

在游戏中我们经常会遇到定时器,例如从大方面来每日的零点,节假日双倍经验,boss刷新,从小方面来说回合制中该回合在多长时间内结束,战斗中buff/debuff状态时间,技能的cd时间等等都涉及到定时器,前一种我们实现方式比较多,例如最常用的crontab,quartz都可以实现,而后者更像一种闹钟,到时候就去唤醒一个事件.我们今天就先讨论了下后面这种”闹钟”如何实现.

设计实现

要使用闹钟我们首先想到的就是Timer,但在java 1.5后全新推出了ScheduledThreadPoolExecutor,我们用它来对Timer进行替代,其次我们需要定义一个间隔周期,让这个定时器每隔多长时间去跑一下,看看有没有什么任务可以执行,这个间隔不能太长,太长会导致某些任务触发不及时,但也不能太短,太短容易加重系统开销,我们暂定50毫秒走一次定时器,伪代码看起来像这样


有了AlarmClock后,我们自然需要定义ScheduledTask中需要触发的方法,那这里我们就需要统一的Alarm事件接口,这里我们为简单使用就直接设计了AlarmEvent,代码就改成这样

根据上面AlarmEvent的操作,我们可以进行如下扩展,例如增加AlarmListener接口,用来实现onTime方法,同时我们还可以增加parameter属性这样AlarmEvent就能完成很多不同的任务.

基本上这定时器就已经实现完毕了,基本上这个闹钟已经能完成很多工作,如果还有特殊需要可以自行扩展AlarmEvent,下面我们来看一个最简单的例子

发表评论(沙发空缺中,还不快抢~)

设置头像

*

:wink: :twisted: :smile: :sleep: :shock: :sad: :roll: :razz: :oops: :neutral: :mad: :grin: :evil: :eek: :cry: :cool: