数据更新和视图更新不同步
🪟

数据更新和视图更新不同步

Published
February 9, 2017
Author
WuZheng

记录一个游戏客户端开发过程中一直没有解决得很好的问题。
数据更新和视图更新不同步
以具体的游戏为例: 在诈金花游戏中,几个玩家一起游戏,可能出现下面几种数据和视图更新的不同步:
  1. 游戏开始,给每一位玩家发牌,动画时间2秒,正在发牌过程中,玩家退出房间,出现给空座位发牌的违和情况。
  1. 当前轮数达到上限,系统自动比牌,同时下行多条比牌消息,如果客户端收到消息全部立即处理,界面会同时出现多人比牌的错误情况。
类似这样同时收到多条消息,但是视图展示有先后顺序的时候,客户端必须想办法来处理数据和视图之间更新不同步的问题。

消息队列

既然视图展示有先后,那么消息放进队列,也按照先后顺序处理即可。我们现在也有这么做,这里有2点需要注意:
  1. 准确定位消息处理结束以及解耦类依赖
当前消息处理结束后需要通知队列处理下一条消息,当前消息处理结束可能是在某一段动画播放完毕后,或者某一个面板关闭之后,这些代码可能分布在不同的类里,如何准确的在这些地方通知队列而又不至于让类依赖变成面条需要十分注意。
  1. 不同消息的处理时机
  • 有些消息需要按照先后顺序处理,则需要放进队列中处理,例如: 比牌 -(比牌动画)-> 比牌 -(比牌动画)-> 比牌 -(比牌动画)-> 游戏结束
  • 有些消息是要即时处理的,则不能放进队列,例如: 广播 || 聊天
  • 有些消息在 A 后面需要等待 A 处理完才处理,而在 B 后面则不需要等待 B 处理完就应该进行处理,例如: 顺序处理:游戏开始 -(发牌动画)-> 离开房间 即时处理:玩家跟注 || 其他玩家离开房间
哪些消息放队列,哪些消息不放队列,有几个队列,这些可能根据业务各不相同,如何处理也要十分注意。

服务器配合客户端

既然客户端在消息间有动画展示,那么服务器在消息之间添加延迟,配合客户端的动画展示就行了?这样服务器的数据处理就成功的和客户端的界面展示耦合了,动画变了,客户端和服务器都要跟着一起变。 =。=#

其他方法

客户端存储数据特殊处理?合并同时下行的消息为一条包括所有数据的新消息?针对可能同时下行多条的消息在代码中特殊处理,硬编码?
优雅解决方案找寻中...