用Erlang实现Time Wheel

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

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

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

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

erlang time wheel

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看