SLG服务器中的时间玩法高效设计-时间轮

本文探讨了SLG服务器中大量定时任务的高效处理方法,通过时间轮设计解决传统轮询效率低、协程竞争及停服期间任务追溯等问题。采用时间片事件包装,确保事件按时间顺序执行,提高命中率并避免资源浪费。同时,阐述了时间轮的工作原理和实际应用案例,展示其在服务器重启后追溯停服期间任务执行顺序的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、设计初衷

SLG服务器业务中存在大量的定时任务,传统的处理方式是以服务器按照固定的时间频率进行轮询,在一次轮询中,将所有需要轮询的任务全部检测一遍后,对满足定时任务要求的任务进行处理。这样处理在定时任务数据量较小时,对服务器的效率影响不大,在定时任务数据量巨大时,会有以下问题:
1.一次轮询中,大量的未到达定时时间的任务被执行了检测,降低单次轮询效率
2.按照固定时间轮询时,大部分的时间是在做无效轮询
3.协程竞争问题,每次轮询时无法对轮询对象进行操作,否则会造成协程安全问题
例如:1000个玩家在建造1000个耐久度为1000的建筑时,每5秒钟结算一次,给这些建筑添加1耐久
在这样的场景中,服务器按照固定的时间周期进行轮询,假设轮询周期为1秒,那么建造建筑的寻轮预期能命中200个,命中率为20%.轮询周期越短,命中率越低。大量的宝贵资源被浪费在执行轮询且未命中上.大大降低服务器的负载能力。并且在轮询期间,被轮询的对象无法被增删(轮询是在主协程,单位操作可能在其他协程,一边轮询一遍增删会导致协程安全崩溃)

另外一个问题是,SLG游戏是时间敏感游戏,游戏服务器停服维护期间,这些时间仍然要被计算玩家(单位)进程的,在维护结束时,玩家希望看到的是按照维护时间正常运行后的结果.
例如:服务器维护前,玩家派出部队去攻打某个无主地块,需要行军50分钟后到达,在服务器维护完成后,玩家希望看到的是这支部队A已经打下了这个地块,并且正在返回的路上已经走了10分钟了。
再复杂些,玩家A在服务器维护前,派出部队A1攻打地块B,行军到达时间为50分钟,玩家C在服务器维护前,派出部队C1攻打地块B,行军到达时间为45分钟,在服务器维护完成后,地块B应该是被玩家C打下来了,而玩家A的部队因为到达时间较晚,未能抢到B地块。
这样有顺序的任务队列在SLG游戏中非常常见,服务器停服维护期间需要有这样的一个机制来保证停服期间的应该发生的任务被有序追溯。
这是常规的设计思路没法进行回溯的.故而,设计了以时间滚动的方式来解决以上的问题。
时间轮设计旨在解决以下问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值