实现了一个简单的timer

对于游戏编程来说,timer是绝对不陌生的,不过以前一直使用一些库提供的timer,像sdl的timer,windows api提供的timer,这段时间突然觉得像这种东西还是在自己的游戏引擎里面实现一个,作为基本类库使用。

首先参考了一下linux的timer机制,详细见 http://www.linuxforum.net/forum/showthreaded.php?Cat=&Board=driver&Number=385224&page=0&view=collapsed&sb=5&o=all&vc=1

不过我实现的跟这个还是有点不一样的。

主要思想就是采用一个timer wheel,假设有一个timer的循环队列,队列上面的每个对象(我们叫做slot)是一个timer的list,现在我们处理到了第m轮第n个slot上面,这时候注册了一个timer,这个timer的间隔为interval毫秒,那么这个timer就应该放到第 n + interval / timer_interval (timer_interval为定时器的精度时间)的slot上面,然后挂在到该slot对应的list末尾,因为我们的环有长度,所以如果注册的timer interval时间很长,interval / timer_interval + n可能超出了wheel的长度,不过由于我们是一个环状结构,所以我们这个timer会在第 m + interval % timer_interval轮之后运行,同时是放到 (n + interval / timer_interval)  % max_slotnum这个slot上面。

 

注册完成以后,当我们的处理到相应的slot的上面的时候,我们会一次的从list上面取出timer,然后现判断是否该timer是在该轮运行,不是则不处理,是则处理。如果碰到interval为0的timer,则会一直处理,知道该timer自己删除自己。

另外,由于我们的定时器有一个最小精度,所以除了interval为0的以外,其他的小于timer_interval的时间,我们全认为是timer_interval。

 

这个timer实现的非常简单,而且只能保证精度为timer_interval(一般也就是30ms),不过对于我来说,已经够了。

 

下面帖代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值