• 实现了一个简单的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),不过对于我来说,已经够了。

    下面帖代码。

  • 相关阅读:
    Python学习 day01打卡
    Python变量常量及注释
    Python基础简介
    「ubuntu」sudo命令卡住
    「ubuntu」sudo无密码
    「ubuntu」Ubuntu Recovery模式下只读问题
    「ubuntu」在Ubuntu Server 16.04 LTS下安装VMware Tools(转)
    「mysql」设置utf8编码
    「hive」hive2.3.0配置derby
    「hadoop」log4j参考
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313797.html
Copyright © 2020-2023  润新知