2011-06-05 36 views
5

想象一下,多人白板可以同时吸引多人参与。为了简单起见,可以说白板上有一个可以被任何用户移动或删除的对象。没有用户拥有的对象的概念(即任何用户被允许操纵任何对象是重要的...这是一个免费的所有白板)多人白板竞赛条件

我的问题是这个......如果两个用户试图在同一时间对对象做不同的动作,即一个删除它,另一个移动它,会发生什么?

中只是让消息正确NOW-经过,它就会完全不正常的。

一个想法是有它解决了谁拥有对象的控制,并没有被允许,直到冲突解决发生的客户方一个服务器端控制。冲突的解决可以基于先到先得的原则。

即使这种情况发生得非常快,小延时(〜50-300ms)是不可接受的,因为运动必须在客户端瞬间。例如,不要操纵对象,而是想象一支笔。因为这会拖延到他们已经开始绘画......不太好!

另一个想法是有一个“请求控制”按钮,这如之前询问控制服务器侧延伸....同样的想法,但现在它们不是由笔绘图的初始延迟受挫。这也是不太好,虽然,因为他们必须打的按钮,直到他们可以做任何事情,而这个白板的真正含义为孩子们......

任何其他解决办法? :)

回答

3

这是一个有趣的问题,通常通过客户端和服务器端解决方案的组合解决。如果你熟悉魔兽世界,特别是最初的发布日期,你会记得服务器崩溃,每个人都在继续移动。这由客户端管理谓词运动完成,并请求服务器定期更新实际位置和行为值。

类似的想法应该适用于您的问题。您在f.c.f.s的基础上的服务器端分辨率看起来很理想。您提到的问题是延迟降低了用户体验。要做到这一点,为什么不给用户完整的客户端控制,然后在操作之后请求从服务器进行更新?因此,如果将圆圈向下移动200px,并将颜色更改为绿色,我们都可以看到即时客户端行为,但是当您释放该圆圈时,您也会看到它变为绿色,正如通过服务器告知的那样。

最明显的问题这个时候两个用户更改对象相同的属性越高。在这一点上,f.c.f.s系统需要根据客户的使用情况做出决定。它应该在对象上执行净增量吗?你是否应该通知用户其他用户以不同的方式更改了对象?这是一个比技术问题更多的特征问题。

+0

我喜欢你如何指出冲突只存在于特定的财产变化!即颜色和位置不是冲突,但位置和位置或位置和删除是...... – davidkomer 2011-06-05 09:44:51

+0

我猜只是最简单的级别,如果服务器给出对象的消息,我可以保持历史并“跳回并禁止控制” -locked ...... – davidkomer 2011-06-05 09:46:17

+0

一个简单的解决冲突的类似属性操作将时间戳的用户交互和维护最新的变化(或者如果对象被删除只是不停地删除) – dain 2011-06-05 13:57:42

0

真的很有趣的问题!白板的状态存储在服务器上(例如在数据库中)。客户端有三种可能的操作:startEditing,finishEditingdelete。在执行一些操作之后,您应该向服务器发送消息来描述操作。

如果发送startEditing,首先应检查您要编辑的对象是否没有锁定。如果它被解锁,你应该放置锁(锁应该包含关于放置锁的用户的信息)。然后,您应该向所有活动客户端发送消息,告诉该对象不应该被编辑。

如果finishEditing(这个应该包含关于对象变化的信息)被发送,你应该改变数据库中的对象释放锁定并发送消息给所有活动客户端,告诉更改并释放锁定。

如果delete发送。如果对象不是由客户端从一个它发送的消息不同的锁,你应该从数据库中删除对象,并发送消息给所有活动的客户端责令删除白板

+0

的问题是,当发送startEditing,“检验”要求一个检查serverside,引入延迟 – davidkomer 2011-06-05 10:06:59

+0

如果第一个客户端在与第二个同时发送'startEditing',一些客户端将第一个放置锁,第二个将看到锁,并且什么都不做 – Eugeny89 2011-06-05 10:28:33

+0

是的,但是再次 - 问题是如果客户有锁,客户端必须立即绘制。 – davidkomer 2011-06-05 12:44:59

0

该对象您可能能够做一些事情,其中您将展示本地物品互动以及其他人看到的内容。在开始时你会展示一些类似的东西,你正在与之交互或写作的透明对象不是最终的,每个人都看到不透明的对象/图画是最终的,以及所看到的。

当您检测到2个用户同时移动一个物品时,在他们自己的屏幕上它们都是透明的,在一些多人游戏更新的过程中,已确定控制的用户仍在移动物体,而您可以显示正在移动其物体的用户的某种事件(也许是普通噗噗声),现在已经被确定为不受他们控制。

这样,当确定他们不会成为一个在项目的控制,你得到即时响应绘图和有点沮丧,不时。

+0

如果我正确地理解了您,它与我上面所说的一样 - “我猜只是最简单的级别,我可以保持一个历史和“跳回并禁止控制”,如果服务器对锁定的对象的消息......“ ,但你已经添加在客户端的视觉线索,使他们能够有一个对象区分实际上是对可能是临时尝试的举动...?是对的吗?我喜欢! – davidkomer 2011-06-09 06:08:20