多人白板竞赛条件

时间:2011-06-05 06:32:56

标签: c# flash actionscript-3 multiplayer

想象一下多人白板,几个人可以同时画画。为了简单起见,我们可以说白板上有一个可以被任何用户移动或删除的对象。没有用户拥有的对象的概念(即,允许任何用户操纵任何对象都很重要......这是一个免费的所有白板)

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

现在 - 只是让消息通过,它就完全没了。

一个想法是拥有一个服务器端控件来解决谁拥有对象的控制权,并且在解决冲突之前不允许任何事情发生在客户端。冲突解决可以基于先到先得的原则进行。

即使这种情况发生得非常快,但是小延迟(~50-300ms)是不可接受的,因为在客户端必须立即进行移动。例如,不要操纵对象,而是想到笔。因为有一个延迟,直到他们已经开始画画......不好!

另一个想法是有一个“请求控制”按钮,它要求服务器端扩展控制....与以前相同的想法,但现在他们不会因笔画的初始延迟而感到沮丧。这也不是很好,因为他们必须按下那个按钮,直到他们可以做任何事情,这个白板真的是给孩子们的......

还有其他解决方案吗? :)

3 个答案:

答案 0 :(得分:3)

这是一个有趣的问题,通常通过客户端和服务器端分辨率的组合来解决。如果您熟悉WoW,特别是最初的发布日,您将记住服务器崩溃并且每个人都继续移动。这是由客户端管理预测变动,并请求服务器定期更新实际位置和行为值。

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

当两个用户更改对象的相同属性时,显而易见的问题就出现了。此时,f.c.f.s系统需要根据客户端使用情况做出决定。它应该在对象上执行净增量吗?您是否应该通知用户另一个用户以不同方式更改了对象?这更像是一个功能问题,而不是技术问题。

答案 1 :(得分:0)

非常有趣的问题!白板的状态存储在服务器上(例如,在DB中)。客户端有3种可能的操作:startEditingfinishEditingdelete。执行某些操作后,您应该向服务器发送一条消息来描述操作。

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

如果发送finishEditing(这个应包含有关对象更改的信息),则应更改DB中的对象,释放锁并向所有活动客户端发送消息,告知更改并释放锁定。

如果发送了delete。如果客户端未锁定对象与发送消息的对象不同,则应从DB中删除该对象并向所有活动客户端发送消息,命令从白板中删除该对象

答案 2 :(得分:0)

您可能会在显示本地项目交互以及其他人看到的内容时执行某些操作。在开始时你展示的东西,你正在与之交互或写作的透明对象不是最终的,每个人都看到不透明的对象/绘图是最终的,无论人们看到什么。

当您检测到2个用户同时移动某个项目时,在他们自己的屏幕上它们都是透明的,在某些多人游戏更新过程中,已确定具有控制权的用户仍在移动该对象,您可以显示正在移动其对象的某种事件(可能是通用的poof),该对象现在已被确定为不受其控制。

通过这种方式,当他们被确定为不能控制某个项目时,您会立即得到绘图响应和一点点挫折感。