重连数据异常问题


在游戏实际运行的过程中,可能会因为网络原因,而导致客户端收不到后端发的消息来更新状态,待之后网络恢复之后,则会请求服务端关于当前的游戏状态,而这个请求的以及应答的过程就是重连

一般为了能实时响应客户端的请求,游戏运行逻辑和网络请求,是通过多线程或协程的方式来实现的。
这样就会出现,在游戏运行计算逻辑的同时,客户端发送了重连请求,这时候如果两个线程刚好操作相同的数据时,就会发生资源抢占问题;即使是在协程中,也有可能因为计算逻辑临时操作了原数据,导致重连请求拿到的数据不准确。

解决方法:

  • 尽量在游戏计算逻辑的临时操作中,不操作游戏的原数据。一般不考虑性能的做法是,拷贝一份数据(注意对于数据量太大的,不要使用这种方法)用于计算,最后将结果返回。
  • 每隔一段时间生成重连数据的快照,然后缓存距离下一次生成快照过程中的状态更新信息,待客户端重连时,直接发送最新的快照和缓存中的状态更新信息。注意该缓存会在每次更新快照时,进行清空。

围观功能

对于数据快照和缓存状态更新信息的这种方式,还能实现围观游戏的功能,每次进入围观,就相当于重连,之后在游戏中围观时,只需要将状态更新信息实时发送给对应的围观客户端即可。

results matching ""

    No results matching ""