想象一个多人游戏白板,几个人可以同时画画。为简单起见,假设白板上有一个对象,任何用户都可以移动或删除该对象。没有用户拥有对象的概念(即允许任何用户操作任何对象是很重要的......这是一个免费的白板)
我的问题是......如果两个用户同时尝试对对象执行不同的操作,即一个删除它另一个移动它,会发生什么?
现在 - 只是让消息通过,一切都变得一团糟。
一个想法是有一个服务器端控件来解决谁拥有对象的控制权,并且在解决冲突之前不允许客户端发生任何事情。冲突解决可以基于先到先得的原则。
尽管这可能发生得非常快,但微小的延迟(~50-300 毫秒)是 Not Acceptable ,因为客户端的移动必须是即时的。例如,与其操纵物体,不如想想一支笔。因为有延迟,直到他们已经开始绘图......不好!
另一个想法是有一个“请求控制”按钮,它要求服务器端扩展控制......与以前的想法相同,但现在他们不会因为笔画的初始延迟而感到沮丧。这也不太好,因为他们必须按下那个按钮才能做任何事情,而且这个白板真的是为 children 准备的......
还有其他解决方案吗? :)
最佳答案
这是一个有趣的问题,通常通过客户端和服务器端解决方案的组合来解决。如果你熟悉魔兽世界,尤其是最初发布的日子,你会记得服务器崩溃,每个人都在继续移动。这是通过客户端管理预测移动并从服务器请求定期更新实际位置和行为值来完成的。
类似的想法应该适用于您的问题。您在 f.c.f.s 基础上的服务器端分辨率似乎很理想。您提到的问题是延迟会降低用户体验。要解决这个问题,为什么不给用户完全的客户端控制,然后在操作后向服务器请求更新呢?因此,如果你将一个圆圈向下移动 200 像素,并且我将颜色更改为绿色,我们都可以看到即时的客户端行为,但是当你释放圆圈时,你也会看到它变成绿色,这是通过服务器告知的。
当两个用户更改对象的相同属性时,就会出现明显的问题。此时,f.c.f.s 系统将需要根据客户端的使用情况来决定要做什么。它应该对对象执行净增量吗?您是否应该通知用户另一个用户以不同的方式更改了对象?这与其说是技术问题,不如说是功能问题。
关于c# - 多人白板竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6241377/