解码mmo游戏服务器一:时间轮的引入

问题引入:在mmorpg游戏中,群战的时候,玩家释放技能,这时候会出现技能冷却时间,每一个技能都是一个定时器,或者在slg游戏中,玩家修建房屋,创建基地,都会产生一个延时操作,等到了指定时间后,完成房屋修建等任务!!!!!

轮询的尴尬:使用一个定时器,定时遍历多个链表,判定链表里面的任务是否到期! 效率低下,每一次遍历都需要筛选定时器,时间复杂度O(n).

多定时器的尴尬:同时创建多个定时器,每个定时器绑定到期任务,多定时器,会加大cpu的负荷,且任务的到期时间不同,必定会产生更多的定时器。

解决方案:时间轮的引入

如果所示:将同一时间的任务放在一起,组成一个链表,图中每个格子分别指向这样一个链表,定时器每到期一次,图中的指针移动一格,如此循环往复,当指针指向某个格子,代表这个链表里面的定时器可能到期(注意,这里是可能,因为时间轮是一个循环的圈,比如运行一圈需要时间50s,那么一个100s的定时器,虽然在槽位1的链表中,但是需要时间轮运行两圈,这个定时器才到期)。

golang 实现的时间轮git地址:https://github.com/yyhero/timewheel

使用示例:

// 创建房屋
func (this *Player) ConstructHouse() {
	fmt.Printf("玩家:%v开始创建房屋,cur houseNum:%v\n", this.id, this.houseNum)

	// 添加定时器,2s之后创建完成
	timewheel.GetInstance().AddTimer(2*time.Second, "001", func() {
		this.houseNum += 50
		fmt.Printf(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值