大家好,又见面了,我是全栈君。
游戏开发总会要用到timer,离不开定时器的使用。像界面需要定时去绘制更新界面,后端也需要来定时执行逻辑,驱动事件。条条道路通罗马,就看你使用技巧好不好了。
一般服务器都是10ms一个tick,地图进程就在每个tick时执行逻辑处理,例如检查buff是否到期了,怪物是否该去攻击或走路了。以前的项目总是遍历整个列表,检查每个buff是否到期。可想而知,当列表长度大了,这里会耗费不少计算,而这些却是不必要的。当然优化方案也是有的,其中之一就是实用time wheel时间轮了。具体原理我就不啰嗦了,可以参考引用资料
原理还是很简单,采用多层时间轮会好点。当然具体问题还是具体分析,当需要大量定时器时,时间轮还是不错的。如果像玩家进程,只是少量需要的,可以使用更简单的方案。保存timer有序列表,每次添加,删除完定时器,都保证列表有序,然后只需从列表中取出第一项出来,加入到系统的定时器等待,超时了又再取下一个。这样就不需要定时tick去检查了,同时也不会占用多余的cpu,节省了资源,而且实现也是很简单的。像我在项目实施的,插入,删除的复杂度都在O(n),但实际上N是很小的,所以可以不需考虑性能问题。最后就是附上我基于skynet上的timer实现,用erlang实现的timewheel了^_^
转载于:https://my.oschina.net/rongtou/blog/813233
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108711.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...