想象一下,一个多人白板,几个人可以同时画。为了简单起见,假设白板上有一个对象,任何用户都可以移动或删除它。没有用户拥有的对象的概念(即允许任何用户操作任何对象是很重要的……这是一个免费的白板)
我的问题是...如果两个用户同时尝试对对象执行不同的操作,即一个用户删除它,另一个用户移动它,会发生什么?
现在-只是让消息通过,它就会变得不正常。
一个想法是有一个服务器端控件,它解决了谁拥有对象的控制权,并且在冲突解决之前,客户端不允许发生任何事情。冲突解决可以基于先到先得的原则。
即使这可能发生得非常快,但小的延迟(约50-300ms)是不可接受的,因为在客户端移动必须是瞬时的。例如,不是操纵对象,而是想一支笔。直到他们已经开始画画的时候才会有延迟。不太好!
另一个想法是有一个“请求控制”按钮,它向服务器端扩展请求控制……和以前的想法一样,但现在他们不会因为最初的画笔延迟而感到沮丧。这也不是很好,因为他们必须按那个按钮,直到他们能做任何事情,而这个白板真的是为孩子们准备的……
是否有其他解决方案?:)
发布于 2011-06-05 16:35:46
这是一个有趣的问题,通常通过客户端和服务器端解决方案的组合来解决。如果你熟悉WoW,特别是最初发布的日子,你会记得一台服务器崩溃了,每个人都在继续移动。这是由管理预测性移动的客户端完成的,并向服务器请求有关实际位置和行为值的定期更新。
类似的想法也应该适用于你的问题。基于f.c.f.s的服务器端解析看起来很理想。你提到的问题是延迟降低了用户体验。要做到这一点,为什么不给用户完全的客户端控制,然后在操作后从服务器请求更新?因此,如果你将一个圆圈向下移动200px,我将颜色改为绿色,我们都可以看到即时的客户端行为,但当你释放圆圈时,你也会看到它变成绿色,这是通过服务器告诉你的。
当两个用户都更改了对象的相同属性时,这就变成了一个明显的问题。在这一点上,f.c.f.s系统将需要根据客户的使用情况做出决定。它应该在对象上执行净增量吗?您是否应该通知用户另一个用户以不同的方式更改了对象?这更多的是一个功能问题,而不是一个技术问题。
发布于 2011-06-05 17:05:35
真的很有趣的问题!白板的状态存储在服务器上(例如在数据库中)。客户端上有3种可能的操作:startEditing、finishEditing、delete。在执行完某个操作之后,您应该向服务器发送一条消息来描述某个操作。
如果发送了startEditing,首先应该检查要编辑的对象是否没有锁。如果它是解锁的,您应该放入lock (锁应该包含有关放入锁的用户的信息)。然后,您应该向所有活动客户端发送消息,告知不应编辑该对象。
如果发送了finishEditing (它应该包含有关对象更改的信息),您应该在DB中更改对象,释放锁,并向所有活动客户端发送消息,告知更改和释放的锁。
如果发送了delete。如果对象未被与发送消息的客户端不同的客户端锁定,则应从数据库中删除该对象,并向所有活动客户端发送消息,命令从白板中删除该对象
发布于 2011-06-08 05:24:15
你可以做一些事情,展示本地的项目,交互以及其他人看到的东西。在开始的时候,你展示了一些东西,比如,你正在与之交互或写作的透明对象并不是最终的,每个人都看到了不透明的对象/图形是最终的,以及人们看到的任何东西。
当你检测到两个用户同时移动一个项目时,他们在他们自己的屏幕上都是透明的,在一些多人游戏更新的过程中,已经确定拥有控制权的用户仍然在移动该对象,并且你可以显示用户正在移动他们的对象的某种类型的事件(可能是通用的轰鸣声),现在已经确定该用户不在他们的控制范围内。
这样,当他们被确定不是控制项目的那个人时,你会立即得到绘图响应,并不时地感到有点沮丧。
https://stackoverflow.com/questions/6241377
复制相似问题