指数
第1部分:简介
第2部分:拓扑
第3部分:锁步和回滚
第4部分:异步服务器-客户端和日志补偿(即将推出)
第5部分:处理数据包丢失(即将推出)
第6部分:构建Netcode协议(即将推出)
为了使不同机器上的多个玩家一起玩游戏,需要一种机制来使所有机器保持同步,以便玩家看到游戏状态的准确一致的表示,并允许玩家为其输入提供一种方式来影响游戏状态。共享游戏状态。
该游戏状态表示游戏会话的当前状态(对于MMO,则表示游戏世界的当前状态),并且包括诸如所有玩家,NPC或单位的位置和移动之类的信息; 子弹和弹丸; 以及诸如得分,金钱和资源之类的统计数据的价值。 游戏事件(例如运动,碰撞和命中检查以及生成弹丸)会影响游戏状态,并且可能源自玩家的输入,也可能来自于处理NPC动作时的游戏引擎。 影响状态的状态和/或事件必须以某种方式在所有计算机之间同步; 否则,一个玩家在自己的机器上看到的物体将不在另一个玩家的视线范围内,从而导致游戏混乱或不公平。

在可能以不同速度运行的不同机器上进行所有这些同步,同时处理诸如延迟/滞后,数据包丢失和有限带宽之类的网络物理限制,所有这些都属于“ Netcode”这一统称。
网络延迟是指信号从其源到达其目的地所花费的时间。 在处理Netcode时,永远不能假设信号可以瞬间从A传到B,实际上,存在很大一部分Netcode只是为了处理这一事实。
当两台计算机之间存在延迟时,在一台计算机上生成的任何事件都需要一些时间才能到达另一台计算机。 如果此延迟足够长,则另一台计算机上的游戏状态可能已经继续,因此该事件被应用于一台计算机上与另一台计算机上稍有不同的游戏状态,从而导致不同的结果。
在一个基本的例子中,想象一个简单的(基本上是有缺陷的)FPS游戏,其中一名玩家射击另一名当时正好在其十字准线内的玩家; 射击事件会发送给其他玩家,并且花费少量时间才能到达。 由于网络延迟,在事件到来时,其他玩家的游戏状态可能已更新至不再与十字准线对齐的位置。 结果是一台机器被击中,另一台机器被击中。 如果无法解决此延迟问题,则两台计算机上的游戏状态将不再同步。

网络连接的基本延迟主要由以下三点引起:
1.根本不可突破的物理速度极限:光速
无论我们的技术多么出色,任何信号传播的速度都不能超过光速。 考虑一下悉尼的一名玩家与纽约的一台服务器进行连接,该玩家的球面距离为1.6万公里(或1万英里)。 以光速传播的信号需要53毫秒才能达到此距离。
实际上,数据传输的实际距离要大得多,因为数据必须通过Internet连接传输到本地交换机,然后传输到悉尼的国家互联网骨干网,再潜入缠绕的海底光缆中澳大利亚,沿着海底到达斐济,然后到达夏威夷,沿着华盛顿州的海岸线插入美国,然后跳入一条通往芝加哥的陆路光纤,然后又到达一条从芝加哥到纽约的光纤。找到通往服务器的方式。

此外,光在光纤中的传播比在空气或真空中的传播慢,可能要慢30%。 因此,由于额外的距离和较慢的行进速度,该53ms的等待时间可能很容易变为80ms。
2.分组路由延迟
在这一史诗般的旅程的多个点上,数据包必须由某些网络设备读取,这些设备必须确定接下来要向下发送数据的线路。 这就要求将部分数据包读入网络设备内部的处理器中,提取其目标地址,并将其与路由表进行匹配,然后再沿着正确的线路路由到希望更接近目标目的地一步的网络节点。 。
不幸的是,这样做需要时间,并且每次发生时,都会向该数据的总行程时间中添加一个小的延迟。 考虑到必须将数据路由到目的地的大量网络节点所导致的延迟,该80ms的信号传播延迟可能变为100ms。
3.往返,确认和重新传输
根据所使用的网络协议以及数据包丢失的可能性,在此线路上可能要花费不止一次行程才能完成数据传输。 例如,TCP数据包需要从目标计算机接收确认,以确保正确传输了一条数据。 如果未收到确认,或者接收到的数据已损坏或不完整,则发送方将重试重传。
这意味着对于需要确认的TCP和其他协议,最多只能进行一次往返来完成每个数据传输,而在更坏的情况下(如果发生数据丢失和重传尝试)则需要多次往返。 在以前的悉尼到纽约的示例中,由于传播和路由延迟,现在的时钟为100毫秒,往返时间将此时间翻倍,达到200毫秒; 并且每次其他重传尝试都将成为此数字的倍数。
因此,在最佳情况下,该播放器的ping(往返时间)为200毫秒。 它没有比这更好的方法了,实际上,如果发生网络拥塞,网络中断,数据包丢失和路由更新,情况可能会变得更糟,所有这些都会带来临时的额外延迟(也称为滞后尖峰)。

幸运的是,对于本地网络多人游戏,延迟情况要好得多,同一有线本地网络上的计算机的ping时间为1ms或更短,而具有最新WiFi标准的同一无线网络上的计算机的ping时间为4ms或更短。 但是,即使将游戏设计为仅在网络延迟小于1毫秒的本地网络上玩,也必须通过netcode正确地计算延迟,因为网络仍然很可能会出现意外的延迟峰值或计算机本身的内部机制。 即使是单个延迟峰值也足以使未构建为处理延迟的游戏不同步。
在第2部分中,我们将讨论在使用或不使用专用游戏服务器的情况下,游戏客户端可以相互连接的不同方式。