想象一个多人白板,几个人可以同时画画。为简单起见,假设白板上只有一个对象,任何用户都可以移动或删除它。没有用户拥有的对象的概念(即,重要的是允许任何用户操作任何对象……这是一个免费的白板)
我的问题是...如果两个用户尝试同时对对象执行不同的操作,即一个用户删除了另一个用户移动了它,会发生什么?
现在-只要让消息通过,它就完全摆脱了麻烦。
一种想法是拥有一个服务器端控件,该控件可以解析谁拥有该对象的控制权,并且在解决该冲突之前,不允许在客户端发生任何事情。解决冲突可以基于先到先得的原则。
即使这可能很快发生,但小的延迟(〜50-300ms)还是不能接受的,因为在客户端必须立即移动。例如,不用操纵对象,而想到一支笔。因为要等到他们已经开始画画才拖延……不好!
另一个想法是有一个“请求控制”按钮,该按钮要求服务器端扩展进行控制....与以前一样,但是现在它们不会因笔画的最初延迟而感到沮丧。但是,这也不是一件好事,因为他们必须按该按钮才能做任何事情,而该白板确实是为 child 准备的。
还有其他解决方案吗? :)
最佳答案
这是一个有趣的问题,通常可以通过结合客户端和服务器端的分辨率来解决。如果您熟悉《魔兽世界》,尤其是最初的发行日,您会记得服务器崩溃了,每个人都在继续前进。这是由客户端管理谓词移动并从服务器请求定期更新的实际位置和行为值来完成的。
类似的想法应适用于您的问题。以f.c.f.s为基础的服务器端分辨率似乎很理想。您提到的问题是延迟降低了用户体验。为此,为什么不给用户完全的客户端控制权,然后在操作后从服务器请求更新呢?因此,如果您将一个圆圈向下移动200px,并且我将颜色更改为绿色,我们都可以看到客户端的即时行为,但是当您释放该圆圈时,您也会看到它变为绿色,这是通过服务器告知的。
当两个用户都更改对象的相同属性时,这便成为一个明显的问题。此时,f.c.f.s系统将需要根据客户的使用情况来决定要做什么。它应该在对象上执行净增量吗?您是否应该通知用户另一个用户以其他方式更改了对象?这更多是功能问题,而不是技术问题。