在线游戏中实时同步多用户数据的设计模式建议

5

我正在做一个学习node.js的项目,并寻求一些关于如何实时同步用户数据的建议。

假设你有一个2D矩形地图(大约600x400),上面有许多占据不同x,y位置的玩家。每个用户都可以使用箭头键进行导航,并以某种基本方式与其他用户进行交互。考虑到这将在HTTP上进行,什么样的设计模式最适合处理和同步用户数据,以提供最流畅、最敏捷的体验呢?

我可以想到几个选项,但希望得到更多的想法/澄清:

  1. 客户端将位置数据发送到服务器,服务器将所有位置分发给所有客户端,屏幕用结果渲染。重复此过程。缺点是客户端由于数据往返所需的时间而滞后,但优点是他们与所有用户同步。

  2. 客户端不断渲染它认为自己的位置,将位置数据发送到服务器,服务器将所有位置分发给所有客户端,然后从客户端数据中校正屏幕渲染。优点是响应更快,缺点是稍微失去了同步。

  3. 两者的混合,但是我们不使用(x,y)坐标,而是使用一个向量[上一个x/y和时间,当前的x/y和时间,建议的时间间隔内的x/y],然后可以用来绘制不断变化的弹道路径。这似乎很难实现。

有什么指针吗?


使用socket.io进行通信。 - Alfred
1个回答

5

大多数游戏使用某种形式的死算法http://en.wikipedia.org/wiki/Dead_reckoning,它允许从服务器分发延迟更新但保留客户端实时更新的某些幻象。

最佳选项是3。这并不特别复杂 - 只需根据游戏机制跟踪每个角色预计在哪里,当您从服务器接收到更新时,可以随着时间将两个状态对齐。

如果您发现服务器发送给您的状态与客户端假定的状态相差太远(需要定义“太远”),则您可以直接跳转到服务器状态并接受客户端的不连续性。


是的,我会这么做。根据你的数据传输格式,这种不连续性很少会被注意到。请告诉我你在使用套接字而不是轮询... - landons
即使您使用socket.io,大多数用户仍然依赖轮询,目前只有少数浏览器启用了WebSockets。 - Ricardo Tomasi
@Ricardo:通过使用Websockets(http://caniuse.com/websockets)和Server-sent Events(http://caniuse.com/eventsource),他将能够向大多数客户端推送数据而无需轮询 - 仅IE用户需要使用轮询。 - Tobias P.
@Tobias 请再读一遍我的评论,再看一下图表。我认为你只是指IE、Android、Opera和Firefox <6以及Safari <5的用户。或者用我的话来说,“你依赖轮询来获取大多数用户”,约75%的用户。我理解你的冲动,但是我想指出第一个评论有多么迂腐。请告诉我你正在使用Mac和15mbps的连接,而不是XP和1mbps... - Ricardo Tomasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接