如何使用 websockets 进行实时游戏

Posted

技术标签:

【中文标题】如何使用 websockets 进行实时游戏【英文标题】:How to use websockets for real-time gaming 【发布时间】:2012-02-14 18:10:11 【问题描述】:

我想制作一个使用 websockets 和 node.js 服务器的 2 人乒乓球游戏。 socket.io 用于客户端和服务器。到目前为止,我唯一的经验就是创建一个聊天应用程序。

这是我第一次尝试多人游戏,所以我对网络游戏不太熟悉。服务器是否应该跟踪:

    球所在的每个位置以及多久或何时? 玩家移动,玩家向左或向右移动,长按会怎样,如何处理?我应该像pressHoldStartPositionpressHoldStopPosition 一样发送吗?如果我只允许按下而不是按住,我想这很容易。

我的想法:

    当球击中一名球员时,客户端会计算速度、开始和结束位置,而另一个客户端应该从中执行正确的动画。 不知道。

【问题讨论】:

您绝对应该看看@RobHawkes 博客:rawkes.com 他已经开发并继续构建名为Rawkets rawkets.com 的html5 多人游戏。我相信他会分享一大堆与您正在寻找的内容非常相关的主题信息以及您会遇到的其他内容。 【参考方案1】:

    客户端计算 - 没有 - 除非您希望它预测下一个游戏步骤*(服务器 anwser)。整个游戏在服务器上运行,这是唯一一个值得信赖的数据和计算来源。在少于 10 个对象的乒乓球类游戏中,您可以经常发送数据(50 毫秒间隔即可)。对于球,我会发送 [x, y, velocity, or angle],对于桨 [x, y]。 然后在旧的(客户端上的 x,y)和新的(您刚刚从服务器获得的 x,y)之间插入(动画时间 - 50ms)。

    不要发送数百万份 - 玩家按下 - 而是在每个时间段(100 毫秒?)发送一个数据包,其中包含“玩家按下”100 毫秒或“玩家设置位置”等信息到 ( 32, 100) 然后检查服务器端是否可以执行此操作并接受或拒绝。

也许这个帖子会对你的冒险有所帮助:

Multiplayer javascript game built with Node.JS - Separating players

[*1] 预测是一种滞后补偿机制,您可以稍后实施。简而言之,这意味着服务器和客户端共享一些游戏逻辑代码,当客户端没有来自服务器的当前数据时,它会尝试模拟真实游戏中发生的情况。

【讨论】:

【参考方案2】:

您会在书本上找到有关游戏网络的书籍。

简而言之,这是我发现的一个有趣的实现: 服务器和客户端计算游戏的物理。服务器将成为主控,并拥有所有实体的正确状态,而客户端将尝试“预测”实体的状态并保持流畅的动画。 客户端将定期从服务器更新实体的正确状态。在某些游戏中,您可能会看到实体突然传送,这是因为客户端预测的位置与服务器的实际位置不匹配。

实体状态,例如球或球员,通常包含诸如位置、速度、按钮状态(按键向下/按键向上)等信息。

除此之外,它还让您尽情发挥想象力,测试最佳解决方案,看看什么是有效的。有很多因素需要考虑,例如播放器延迟和带宽。

【讨论】:

【参考方案3】:

有一个专门用于游戏开发的stackexchange站点:https://gamedev.stackexchange.com/

最佳做法是仅发送客户需要了解的更新。此外,通常您发送的是用户操作的结果,而不是操作本身。不需要发送可以计算(物理)的东西,除了周期性同步点以解决随时间累积的浮点错误并与远程用户操作同步。这也使游戏看起来更具交互性,并涵盖了由网络延迟和抖动导致的一些卡顿。

此模型的主要缺点是,如果您有高网络延迟或丢包,当物理计算继续时,您将获得时间线发散效应,并且突然您从远程用户那里得到更新,表明他们做了一些事情来影响我们还没有掌握的物理学。但这在大多数网络游戏中是一个标准问题,而对于大多数类型的实时游戏来说,替代方案更糟糕。

【讨论】:

以上是关于如何使用 websockets 进行实时游戏的主要内容,如果未能解决你的问题,请参考以下文章

如何解耦实时游戏架构

php是如何实现websocket实时消息推送的

如何使用django 结合websocket 进行实时目标检测呢?以yolov5 为例

如何使用Tomcat实现WebSocket即时通讯服务服务端

如何在实时服务器而不是本地主机上使用 Tornado 实现 WebSocket

如何使用Django 结合WebSocket 进行实时目标检测呢?以yolov5 为例,实现:FPS 25+ (1: 后端)