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

标签 javascript design-patterns node.js online-game

我正在从事一个学习 node.js 的项目,并正在寻找有关如何处理实时同步用户数据的一些建议。

假设您有一个 2D 矩形 map (大约 600x400),许多玩家占据了该 map 上的 x,y 位置。每个用户都可以使用箭头键四处导航,并以某种基本方式与其他用户进行交互。鉴于这将通过 HTTP 播放,在处理和同步用户数据方面最好的设计模式是什么以提供最流畅、最快速的体验?

我可以想到几个选项,但希望能有更多的想法/说明:

  1. 客户端向服务器发送位置数据,服务器将所有位置分配给所有客户端,屏幕根据结果进行渲染。重复。缺点是客户端会滞后于数据往返所需的时间,但优点是它们与所有用户同步。

  2. 客户端在它认为经常出现的位置进行渲染,将位置数据发送到服务器,服务器将所有位置分配给所有客户端,然后使用服务器数据校正客户端数据的屏幕渲染。好的一面是响应更迅速,缺点是稍微失去同步。

  3. 两者的混合,但不是使用 (x,y) 坐标,而是使用 [先前的 x/y 和时间,当前的 x/y 和时间,建议的 x/y 在时间interval] 然后可以用来绘制不断移动的射弹路径。这似乎很难实现。

有什么建议吗?

最佳答案

大多数游戏都使用某种形式的航位推算 http://en.wikipedia.org/wiki/Dead_reckoning它允许从服务器分发延迟更新,但在客户端保留了一些实时更新的错觉。

最好的选择是 3。它不是特别复杂 - 只需跟踪您期望每个 Actor 基于游戏机制的位置,并且当您从服务器收到更新时,您会随着时间的推移使这两个状态保持一致。

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

关于javascript - 在线游戏中实时同步多用户数据的设计模式建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7131688/

相关文章:

javascript - jQuery 淡入/淡出竞争条件?

javascript - 使用 Angular 6 中的 Observable 捕获 Promise 拒绝错误

node.js - 如何在 Node pg 中设置 postgres 数据库和表

linux - 使用 Linux 命令行卸载 Node.JS?

javascript - reCaptcha 小部件不会过期并且永远不会调用过期的回调

javascript - 在某处添加 javascript 脚本标记,以便它适用于 sphinx 文档中的每个文件

python - 创建一个有点像博格的类

ios - iOS中如何根据不同用户类型动态切换UI主题

algorithm - 在不修改集合的情况下获取更改命令

javascript - addAssociation 上的 promise 是用旧版本的源解决的