这是JavaScript多人游戏开发系列的第三部分,也是最后一部分。 您可能需要阅读第一部分和第二部分。 这篇文章为任何想要用JavaScript开发自己的多人游戏的人提供了一些指导性概念。 它还介绍了Lance.gg ,这是我们在此过程中开发的开源库。
如果您分叉,我也不会生气。 该代码在此处可用。
- 第2部分:在虚幻引擎中重新创建“最后的我们”
- UE4 vs Unity的快速游戏和一些思考
- 严肃的游戏,以及他们可以为我们做什么
- 3..2..1..G0 —视频游戏
- 我的主线:雅典娜(Capcom vs. SNK 2)

了解您的游戏要求
我想退后一步,谈论游戏要求。 在开发spaaace时,我们需要确切地了解我们正在开发哪种类型的游戏。 否则,我们就不会走得太远。 您可以在线玩游戏,欧洲有一个游戏服务器,而美国有一个服务器。
不同的网络游戏类型依赖于实质上不同的网络体系结构实现。 您正在建立第一人称射击游戏吗? 实时策略游戏? 赛车游戏? 大型多人在线游戏? 所有这些类别都具有实质上不同的要求,从而导致不同的首选实现。
在我们的案例中,我们需要实现一个游戏,其中许多微型太空飞船会飞来飞去并互相射击。 我们希望能够支持数百艘宇宙飞船。
这是五个问题的清单,我认为这对从事多人游戏开发的任何人都是有用的。 它们旨在帮助对需求进行分类。 每个问题后都有我们在开发spaaace游戏时获得的答案。
- 游戏是否需要功能齐全的物理引擎,还是可以使用简化的伪物理?
我们的游戏中并没有严格要求使用真正的物理引擎,因为没有重力或约束。 我们只需要根据速度和方向角来计算位置。 如果您的游戏需要约束或周围有很多障碍物,那么您可能需要一个合适的物理引擎,例如cannon.js。 - 游戏对象的位置是离散的还是连续的?
对于spaaace ,位置是连续的浮点数。 但是在某些游戏中,例如实时策略游戏,位置是离散的。 如果游戏对象可以放置在不可见的网格上,则它们的位置是离散的。 - 在任何给定时间将广播多少个对象?
对我们来说,大约一千枚,包括导弹。 请注意,该问题涉及联网对象。 例如,您的游戏可能有多辆汽车,每辆汽车可能包括四个轮子和其他子组件-但如果可能的话,请尝试将每个汽车作为一个实体进行广播。 - 视觉响应是否需要比典型的150毫秒在线ping时间更快?
这是一个棘手的要求,但不幸的是,答案是肯定的。 但是,许多游戏都可以使用巧妙的视觉效果来绕过此要求。 例如,如果用户按下加速按钮,请在实际移动船舶之前考虑显示发光的加力燃烧器100ms。 或者加快服务器上的初始加速,以“赶上”客户端所在的位置。 - 游戏机制是否遵循确定性过程?
这个问题非常重要,因为确定性游戏意味着所有客户都可以在每个步骤中输入完全相同的用户输入来重新创建完全相同的游戏状态。 这意味着客户端可以相互发送输入,而跳过到服务器的跃点。 那很诱人。 确实很诱人。 但是,除非您真的知道自己在做什么,否则您可能不得不对这个问题回答“否”。 确定性游戏引擎需要使用定点数学库来确保所有计算结果都是确定性的。

游戏架构
您可以为游戏的体系结构选择多种选择。 例如,有锁定步骤,内插,外推以及对等变量。 不幸的是,描述这些体系结构超出了本文的范围,但是对于游戏开发人员而言,了解这些替代方案并了解在著名的多人游戏中使用了哪些替代方案至关重要。 您可以在下面提供的阅读资源中了解这些替代方法。
在我们的情况下,鉴于上述答案,适用于Spaaace的体系结构需要客户端预测和简化的物理引擎。 通过网络发送输入和对象位置都是可行的,因为我们没有那么多。 游戏循环可以是60Hz的快速速度,因为我们使用的是简化的物理原理,因此每个步骤在16ms以下都能很好地执行; 服务器状态广播频率也可能很高,因为每次广播仅发送几千字节,所以我选择10Hz。 最后,渲染循环的频率取决于我们,这取决于浏览器的暴虐requestAnimationFrame()
。
我们架构中的主要组件是:
- 游戏逻辑代码。 处理用户在每个飞船上的输入,转动飞船,加速并发射导弹。 检测碰撞(杀死)。 此代码需要能够在服务器上运行,而且还需要在客户端预测模式下的客户端上运行。
- 视觉效果。 绘制船舶和导弹,声音,显示加速推力,摄像机控制,键盘输入,连接和启动时的游戏视觉效果。
- 客户端预测基础结构。 这是一个很大的。 并且需要与游戏无关。 它需要在服务器上运行游戏逻辑,向客户端发送定期广播,并实施客户端预测,以显示每个客户端的推断位置-直到下一个广播中的服务器实际位置到达为止。
- 服务器和客户端设置代码,它们将各个部分连接在一起,开始游戏,连接客户端,跟踪得分等。
一个新的多人同步库:Lance
我们在spaaace中实现的游戏架构基于关注点分离的原理。 我们想从其他多人JavaScript游戏可以使用的代码中分离出特定于我们游戏的代码。 这个基本规则促使我们创建了Lance,一款与游戏无关的多人服务器。 我们所做的许多工作都在Lance中扩展了功能。

我们发布了Lance作为开放源代码库,因此我希望它将对其他游戏开发人员有用。 目前,Lance实现了许多功能,例如客户端预测,客户端与服务器之间的通信,对象的序列化,步骤漂移处理以及对物理引擎的支持。 未来还有更多计划。 有关更多信息,请访问: http : //Lance.gg
多人游戏与物理文学
- 游戏中的Gaffer:http://gafferongames.com/
- 加布里埃尔·甘贝塔(Gabriel Gambetta):http://www.gabrielgambetta.com/fast_paced_multiplayer.html
- Glazer和Madhav撰写的“多人游戏编程”书
其他资源
我们在spaaace中使用的开发堆栈是:nodejs,socket.io,WebPack打包程序,es6语言支持,PixiJS和Lance。
这可能也很有用:

结论
这是我关于JavaScript多人编程的分句。 它工作正常。 您可以选择使用socket.io构建自己的基础结构,也可以尝试使用WebRTC进行更进一步的开发,并进行P2P通信。 更好的是,http://Lance.gg可能会为您提供所需的基础结构,从而使您可以将更多时间花费在重要内容上。
开发将是耗时的,尤其是对于长时间运行的游戏世界或具有敏感计时要求的游戏。 如果它有助于解决与网络游戏有关的问题,请适当考虑更改原始游戏概念或摄像机位置的选项。 有耐心。 涂防晒霜。