简介
在游戏中业务中,日常任务是很重要的一个玩法,比如王者荣耀的日常。
存在的问题
如果大家对游戏行业接触不深的话,首先想到的就是通过任务调度,在晚上12点的时候调度所有的服务器,将服务器服务的本区服所有玩家的数据进行重置。但是有个很大的问题就是如果区服的玩家数量非常大,那这样在某个时间大量重置日常任务时会导致这个时间段服务器会卡顿,从而造成玩家的游戏体验感不好。
设计方案
其实从玩家活跃时间段可知,在晚上12点玩游戏会比晚上19~22点的玩家少很多,所以可以做如下设计:
玩家日常任务表中可以存放任务上次重置时间:
- 对于12点在线玩家,服务器可以通过任务调度对这部分玩家进行重置。具体做法是拿到服务器存有的所有session,根据session拿到玩家的role_id,然后再重置玩家的日常任务表,更新日常任务表时需要重置任务表中的上次重置时间字段为当前时间。
流程图如下:
- 对于12点以后登录上线的玩家,在登录时订阅登录事件,然后去查日常任务表的上次重置时间字段,如果是昨天重置的就重置日常任务表。
流程图如下:
小结
这种设计方案是在业务级别对冷热数据进行分开处理。
不过有些地方需要注意:
- 在12点重置当前区服所有在线玩家数据的时候需要通过异步方式
- 日常任务数据更新时我们会将最新的日常任务数据推送给客户端,日常任务是否完成由客户端来判断。比如你消费了多少钻石,当消费钻石的时候我们会将今日消费的钻石数据推送给客户端,客户端会根据数量来判断是否完成
同时,不只是日常任务,每周任务和每月任务都可以这样设计,只不过日常任务更新更加频繁。
扩展
其实像王者荣耀的排位机制就有点类似这种设计,赛季更新时并不会重置玩家的段位数据,当玩家点击排位的时候再会更新玩家的段位数据