用Erlang实现Time Wheel

游戏开发总会要用到timer,离不开定时器的使用。像界面须要定时去绘制更新界面,后端也须要来定时执行逻辑,驱动事件。条条道路通罗马,就看你使用技巧好很差了。html

通常服务器都是10ms一个tick,地图进程就在每一个tick时执行逻辑处理,例如检查buff是否到期了,怪物是否该去攻击或走路了。之前的项目老是遍历整个列表,检查每一个buff是否到期。可想而知,当列表长度大了,这里会耗费很多计算,而这些倒是没必要要的。固然优化方案也是有的,其中之一就是实用time wheel时间轮了。具体原理我就不啰嗦了,能够参考引用资料linux

原理仍是很简单,采用多层时间轮会好点。固然具体问题仍是具体分析,当须要大量定时器时,时间轮仍是不错的。若是像玩家进程,只是少许须要的,可使用更简单的方案。保存timer有序列表,每次添加,删除完定时器,都保证列表有序,而后只需从列表中取出第一项出来,加入到系统的定时器等待,超时了又再取下一个。这样就不须要定时tick去检查了,同时也不会占用多余的cpu,节省了资源,并且实现也是很简单的。像我在项目实施的,插入,删除的复杂度都在O(n),但实际上N是很小的,因此能够不需考虑性能问题。最后就是附上我基于skynet上的timer实现,用erlang实现的timewheel了^_^git

erlang time wheelgithub

相关文章
相关标签/搜索