具有JavaScript后端和前端的多人游戏。最佳实践是什么?

具有JavaScript后端和前端的多人游戏。最佳实践是什么?,javascript,node.js,multiplayer,Javascript,Node.js,Multiplayer,我正在考虑在中创建一个web多人游戏。这意味着我将在后端和前端使用相同的语言。这将是实时的,每个“房间”最多20人,因此我有一些想法: 我如何补偿所有用户之间的延迟,以便每个人在同一时间看到相同的东西?我正在考虑跟踪每个玩家的平均ping时间,找到最慢的一个,并通知其他客户端他们必须延迟的时间(以毫秒为单位),以便每个人都尽可能地同步 我正在考虑在后端和前端运行游戏代码(因为两端都是JavaScript),并且只有一个错误纠正机制来与后端的“真实游戏”同步。这样的话,游戏在前端的表现应该会很流畅

我正在考虑在中创建一个web多人游戏。这意味着我将在后端和前端使用相同的语言。这将是实时的,每个“房间”最多20人,因此我有一些想法:

  • 我如何补偿所有用户之间的延迟,以便每个人在同一时间看到相同的东西?我正在考虑跟踪每个玩家的平均ping时间,找到最慢的一个,并通知其他客户端他们必须延迟的时间(以毫秒为单位),以便每个人都尽可能地同步

  • 我正在考虑在后端和前端运行游戏代码(因为两端都是JavaScript),并且只有一个错误纠正机制来与后端的“真实游戏”同步。这样的话,游戏在前端的表现应该会很流畅,并且在同步的时候只有很少的小故障。此外,这将最大限度地减少前端JavaScript攻击,因为作弊者将同步到后端游戏

  • 我是否应该通过套接字(按键)接收玩家操作,通知所有其他玩家的操作,同时在后台“玩”游戏,并每隔一段时间向所有人发送整个游戏状态的同步信息以同步它们

  • 你觉得怎么样?有更多的东西我应该考虑还是要注意? 请发布关于多人游戏的任何想法或文档或文章链接


    编辑:这些是有用的:

    • -Glenn Fiedler关于多人游戏网络和物理的非常好的文章
  • 这是很难做到的,我可以看到很多问题与同步到“最慢”。你能放松这一点,让客户“最终保持一致”吗

  • 听起来不错

  • 我会将短动作事件从前端发送到后端,让后端修改游戏状态,并将游戏状态修改事件发布回客户端,同时非常注意只将必要的事件发送给正确的订阅者。在这一点上,您可以丢弃任何看起来不匹配或看起来像伪造/黑客的事件


  • 1-这是不可能的。您不知道一条消息到达客户机需要多长时间,您所做的任何度量都不一定适用于您发送的下一条消息。你能做的最好的事情是近似,但你总是需要假设人们会看到稍微不同的东西,或者在稍微不同的时间看到相同的东西。我建议只将当前状态发送给每个人,并使用插值/外推来平滑游戏性,这样每个人都可以在过去几毫秒内看到游戏,延迟会随着玩家和时间的变化而变化。一般来说,这很少是一个大问题。如果你真的想在服务器上缓冲一些过去的状态,你可以在它们之间插入,并向不同的人发送不同的旧数据,试图同步他们看到的内容,但是结合客户端模拟和传输时间的抖动,你仍然会看到不同机器之间的一些差异

    2-典型的方法是在服务器上运行模拟,并向客户端发送定期(小型)状态更新。客户机通常运行他们自己的模拟,并且有一种方法可以在他们自己的预测/插值状态和服务器发送给他们的权威状态之间进行混合。除用户输入之外的所有决策都应在服务器端做出。最终,你混合这些的方式只是在平滑的外观和精确的状态之间的折衷,所以这是一个你必须做出的化妆决定


    3-您的客户通常应将按键转换为逻辑动作。您的服务器不关心密钥。将该逻辑操作发送到服务器,如果其他客户端需要,它可以将其广播到其他客户端。通常情况下,虽然您不需要在此处执行任何操作-由操作引起的任何相关更改通常只会更改游戏状态,因此将在该状态的正常广播中发送出去。

    一种典型的方法是不尝试强制所有客户端以锁定到服务器的相同帧速率运行。。。它只是变得丑陋。相反,发送频繁的更新,以便客户端在收到新更新时可以更新


    通常,客户机会在短时间内预测情况,然后通过服务器的更新进行更正。您也可以应用时间更正。例如,如果服务器告诉您“玩家2在P以速度V移动”,您可以尝试根据最近的ping来了解该消息的时间,并将位置从
    P
    更正为
    P+x*D

    最好的方法是只在一个位置跟踪所有对象,即服务器。每个人都会在“实际发生”之后的一个行程时间内看到来自服务器的信息,并且人们的命令会花一个行程在服务器上注册。真的没有办法。对于某些应用程序来说,可以在不等待服务器响应的情况下立即模拟自己的移动,但这无疑会导致计时编程的噩梦,人们通常会看到彼此“落后”。碰撞检测几乎是不可能的


    这样做的最终效果是,从您输入命令到看到命令实际发生,都会出现迟钝的情况,但希望人们能够学会应对这种情况,并尝试更早地输入命令以进行补偿。由于连接速度慢,快节奏的实时游戏是不可能的。

    你能详细说明一下“最终一致”吗?我至少有一个对象,每个人都应该在同一时间在正确的位置看到,否则游戏将不起作用,我真的不在乎每个人在同一个位置看到每个人/t