多人白板竞赛条件

dav*_*mer 5 c# flash multiplayer actionscript-3

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

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

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

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

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

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

还有其他方法吗?:)

Ben*_*oux 3

这是一个有趣的问题,通常通过客户端和服务器端解决方案的组合来解决。如果您熟悉《魔兽世界》,尤其是最初发布的日子,您会记得服务器崩溃后每个人都继续移动。这是通过客户端管理预测移动并请求服务器定期更新实际位置和行为值来完成的。

类似的想法应该适用于您的问题。您基于 fcfs 的服务器端分辨率似乎很理想。您提到的问题是延迟降低了用户体验。为了消除这个问题,为什么不给用户完全的客户端控制权,然后在操作后向服务器请求更新呢?因此,如果你将一个圆圈向下移动 200px,然后我将颜色更改为绿色,我们都可以看到即时客户端行为,但是当你释放圆圈时,你也会看到它变成绿色,正如通过服务器告知的那样。

当两个用户更改对象的相同属性时,就会出现明显的问题。此时,fcfs 系统将需要根据客户端的使用情况来决定要做什么。它应该对对象执行净增量吗?您是否应该通知用户另一个用户已以不同的方式更改了对象?这更多的是一个功能问题,而不是一个技术问题。