这段时间还是关注线上问题并一一解答和解决,新开发的功能不是很多,就对几个版本的内容的一些需求再补充和完善,并对之前写的功能模块进行重构。
在测试之前负责的模块时,发现底层基础功能从上线到现在都存在的bug,只是没有测试出来,或者说,在某些情况下,不能操作某个功能导致把这个问题暴露出来。之前这些代码leader实现的时候可能是后面新加的功能,然后在一些创建副本入口都加上判断,但遗漏几个地方所以导致出现如下几个关于切场景的问题,切失败时状态的恢复以及资源的处理。
比如在跨服上因为某些原因是不能进单人副本的,即只能在本小服创建副本,但是按理来说,是可以进有名副本,即本小服的多人副本,比如帮派副本,有帮派成员进入副本后,会给本帮派的成员发一条跳转链接,成员在跨服上时,点击该链接是直接进入该副本(离开跨服场景,进入本服副本),副本结束后回到上一次进入跨服前的场景,而这里不是直接再回到跨服,因为规则问题,是另一回事了。之前出现过两次相似的问题,一个是该副本已经结束但出于待销毁状态,比如这个间隔为几秒钟需要等副本中的玩家主动切出场景或者被踢出。
当有人创建有名副本时,需要待一会时间正式开始,此时需要等更多玩家加入一起刷怪,若有人提前离开时,暂时不管副本的状态,副本那边会走一个定时器,以正式开始时间和创建时的时间差作为倒计时,该定时器到期时,会再检查有没有玩家,没有的话则结束并销毁,但此时会存在一个短暂的时间窗口,当玩家加入该副本副本已经结构但即将销毁时,其实是要作为失败处理的,然后因为实现问题,导致创建玩家对象进入副本时,过早的把消息路由到现在的场景,那么后面的情况是相关实现对进入副本的接口进行虚拟化,这里不让进所以返回失败,所以这里需要对失败的情况处理:把目的场景上的玩家对象销毁,并在跳转点处理失败的情况即把路由再设置回来。
另一个问题是,在前面问题改过的基础上,点副本时出现转圈导致客户端卡顿,服务器上的日志是跳转成功,也在有名副本中创建了该玩家对象,但因为从本场景切到跨服场景时,是需要把本场景的路由重置,但切回来时并没有设置上,并且用了空的路由把原来正确的路由给设置上了,导致副本中的玩家对象出现心跳失败,进行断线处理,但副本中的玩家对象也无法销毁,这里只要用正确的路由设置即可。还有一个也是类似跳转场景问题,就不总结了,有些情况是比较难测试的,涉及过多的状态条件处理,可能会引入一些奇怪的问题,虽然必现,但是如果没有测试到这些,线上就会造成严重问题,只能通过观察线上日志然后再分析源代码。
还有一个是新加的功能需求,即在原来的组队副本基础上加一个困难模式,可用次数是一次,原来的结构设计是一个难度Difficulty和次数Count两个字段,由于兼容问题,需要增加而不能直接删除,但可以在下一次更新点把Count字段删除。由于凌晨五点是要维护的,所以如果此时有玩家在线,且维护时间晚于五点比如延迟后一分钟,那么玩家数据并不是使用到最新的代码处理的,如果玩家不在线,在五点后重新登陆之类的就是最新的,所以会出现有些玩家有两次,有些玩家只有一次,间接影响到参与副本获取到的奖励,当然对于数据兼容还是有比较好的办法,对于google protobuf协议,可以使用optional关键字,但咱们游戏项目中却是一个字段,所以不能直接删除,而是根据是否有Count判断是否是老版本还是新版本。
事情不多的时候准备看看寻路这块,有太多的东西不知道,最近在看recast和navmesh相关,希望能有些收获。
网友评论