网游服务器端设计思考:时间服务(二)需求
网络游戏服务器端对时间的需求可以说是无处不在的,小到技能的冷却、技能的释放时间、物品使用的冷却、怪物的死亡重生、掉落物品的存在时间,大到节日活动的开启、boss怪的精确出生、周任务日任务的准点开始等等。而这些对时间的需求都依赖于服务器端提供的时间服务的实现,因此时间服务、时间控制模块在网游服务器端设计中是占有比较重要的地位。
本系列的第一篇《时间服务(一)序言》也描述了部分需求,但是用词较为戏谑。本文将进一步细化需求,最大程度上把实际工作中对时间的需求描述清楚。
一、总体分类
按照大类来分,时间需求主要分为两大类:相对时间需求和绝对时间需求。下面具体展开来说:
相对时间需求:
相对时间指的是时间间隔,反应在游戏里就是指从现在开始到未来某个时间点的时间间隔,比如从现在开始到以后的5s时间内。在游戏中,一些操作需要占用一段时间才能完成,比如采矿需要读条,以及物品使用、技能吟唱、技能蓄力、上坐骑、跑步、飞行等等,这些操作有一些共同的特性:
1)当下的操作需要持续一段时间才能完成。
2)操作过程不需要存盘,如果玩家下线、掉线则该操作取消。不存在操作做到一半,player下线再上线能接着做的情况。
3)操作持续时间一般会很短,几十毫秒到几十秒不等。
4)持续一段时间才能完成主要出于几个方面的考虑:客户端播放动作、防止各种加速外挂、防止一些状态切换太快影响游戏玩法(比如在战斗的时候瞬间骑上马逃跑,追杀的人死活追不上,可以类比战斗类轻功的设计会有这方面的考虑)。
技能冷却是不是也使用的相对时间呢?不是的,技能冷却使用的是绝对时间(某年某月某日,某时某分某秒),可以想象这样一个场景:玩家A在2月29日两点使用了一个技能X,其中X的冷却时间为一个小时,这个时候玩家A立即下线,那么使用相对时间表示冷却时间就会出现两种情况:如果这个相对时间不存盘,那么玩家A马上再次上线则该技能又可以使用,这显然是不能接受的;如果存盘,那么玩家A在一天以后再次上线,会发现技能还在冷却,同样是不能接受的。
跑步、飞行也需要使用时间服务?这是肯定的,因为在玩家发生位移时,移动过程(播放动作)是由客户端发起,以固定的时间间隔向服务器发送当前的位置,服务器根据玩家的当前位置和上一个位置进行比较,并做对应的检查,其中所需要的相对时间t主要用来检查玩家是否超速。
相对时间模块的设计一般会和游戏的心跳联系在一起,因为心跳的固定间隔正好可以用来计算相对时间,游戏心跳设计参见《心跳设计》,该模块的设计将在本系列的最后进行介绍,如果没有特指相对时间,本系列所提到的时间服务时间控制都是指绝对时间。
绝对时间需求:
绝对时间指的是具体到公元纪年,比如某月某日零时,体现到计算机上则是距离1970.01.01的秒数,或者是tm结构。绝对时间在游戏中的需求也是无处不在的,特定节日活动的开启、每日每周任务、固定时间段刷怪等等。本文剩下的小结将重点分析、细化绝对时间需求。
二、绝对时间需求分类
(1)时区需求
现在做游戏都希望能在海外市场分得一杯羹,因为内国市场日渐饱和,竞争也非常的激烈,每年新增的玩家数有限,而且大部分还被大企鹅瓜分了。这样的条件下,海外市场是一个不错的选择,海外网游玩家往往付费能力很强,而且用户粘性大,一个游戏可以坚持玩很多年(尤其是日本)。可谓“人傻钱多”,因此开发海外版本十分重要,对于服务器端来说,跨时区的问题就是在设计及编码时需要考虑的问题。
时区问题实际上就是服务器端如何解析代表时间的整型值(time_t),并映射到对应的tm结构时具体代表的是哪一天的什么时候。比如:整型值1330675871,在北京时间(东八区)表示2012.3.2 16:11:11 星期五,但同样的整型数值在夏威夷时间(西十区)表示2012.3.1 22:11:11 星期四。服务器在不同时区的地区,如何解释这样的时间整型值就是解决时区问题的关键。
服务器端如何解释这些时间取决于策划,策划在编辑器上填了时间2012.3.2 16:11:11可以表达两种意思。一种是指在所有时区里都是公元2012.3.2 16:11:11时执行某个操作,另一种意思是指全球同步操作,即在策划编辑数据的时区到达2012.3.2 16:11:11时,全球所有的服务器同时做某个操作。服务器端的时间服务模块应该具备这两种时区解释的功能。
(2)时间段需求
时间段是时间服务中最基本的需求,比如在2012.03.01 10:00:00 ~ 2012.04.07 14:00:00期间开启某个活动。
(3)时间重复需求
游戏里常用的时间重复一般出现在任务和活动里,比如每日、每周、每月、每小时的任务,或者还有可能出现每天几点到几点的活动等。
(4)时间项的任意组合
这项需求是比较变态的,比如《时间服务(一)序言》中提到的“2011年至2012年每个月的5号~14号之间,每天8点到15点之间的每小时里5分钟到25分钟的时间里,刷一些特殊怪,而且这一天必须是周五、周六或者周日”。时间项实际上是指年、月、日、时、分、秒、周七项数值,而实际使用中基本上不会精确到秒,因此主要是六项数值的组合。
时间项的任意组合包含了上诉(2)和(3)两项需求。
三、总结:
时间服务在游戏中的使用是非常频繁的,面对上诉需求应该用怎么样一种统一的方式来表达所有的时间格式?在设计时间服务模块时如何能做到简洁方便的注册服务、撤消服务、通知事件发生和回调处理等?这些都是设计者需要考虑的,同时也是本系列后续篇幅需要解决的。