前言
很久不更新Blog了,是自己懈怠了很多,所以在思考了一下之后明白,我需要继续加强学习
加入ubisoft之后其实也没做什么值得称道的事儿
只是一个基础的开发人员,不过工作当中有一些可以被记录和梳理的地方
我也会更新到Blog当中
我会把学习捡起来的,我会的。
开发多人游戏需要了解的概念
首先,开发多人游戏会涉及到非常多的网络概念和机制,所以这里会梳理所有相关的网络机制
梳理这些的原因,是将知识进一步拆分,免得掉入庞大的知识深渊,也可以帮助我们去定点学习
在梳理完这些知识之后,我会根据每个技术单独写Blog(虽然已经开了很多坑了)
Server 和 Client
这个其实比较简单,因为无论是游戏,还是普通的web开发,或者是基础的网络操作,都离不开server和client
Server
游戏的服务器,存储所有玩家数据,记录玩家行为,托管游戏数据,通常是由一组高性能的服务器组成(或者云)
Client
从游戏的角度上通俗来讲,这里指的是玩家的个人设备,例如电脑,手机,主机等等
一般玩家通过Client端连接到Server端进行游戏,它还负责根据从服务器收到的信息向玩家展示游戏世界中发生的事情。
工作原理
- 玩家在他们的设备上(Client)开始游戏。
- 客户端连接到游戏服务器(Server)。
- 服务器(Server)运行游戏,跟踪所有玩家和游戏状态。
- 客户端(Client)将它们的操作(如移动角色或开火)发送到服务器。
- 服务器(Server)处理这些操作,更新游戏世界,并将结果发送回所有客户端。
- 客户端(Client)向玩家显示更新后的游戏世界。
带宽(Bandwidth)
带宽就像是你的互联网连接的容量或“管道大小”。
它决定了在任意给定时间内有多少数据可以通过你的互联网连接传输。
假设你有一根水管。管道的直径代表着你的带宽。
一根较宽的管道可以让更多的水同时流过,而一根较窄的管道则只能让较少的水通过。在互联网的情况下,较高的带宽意味着更多的数据可以通过你的连接传输,而较低的带宽则意味着较少的数据可以通过。
在多人游戏的背景下,带宽是至关重要的,因为它直接影响了:
- 数据传输:
多人游戏之间需要在玩家和服务器之间交换大量信息。这些数据包括玩家位置、动作、聊天消息和游戏更新。较高的带宽可以让这些数据快速而顺畅地流动。 - 减少延迟:
低带宽可能导致游戏出现延迟。如果你的带宽太窄,数据在玩家和服务器之间传输的时间就会更长,从而导致游戏体验不够响应和愉快。 - 多个玩家:
在多人游戏中,服务器经常需要同时与多个玩家通信。当有许多玩家参与时,较高的带宽至关重要,确保数据可以发送给所有人而没有显著的延迟。 - 流媒体:
如果你在网络上直播游戏或分享你的游戏体验,较高的带宽可以让你以更高的质量将游戏体验广播给其他人。
带宽通常以每秒比特数(bps)来衡量。
例如,当你订阅互联网服务时,你可能会看到不同连接速度的优惠,比如10 Mbps、100 Mbps或1 Gbps。
这些数字代表了在一秒钟内可以传输的数据量。数字越高,带宽越大,你的互联网连接传输数据的速度就越快。
延迟 (Latency)
延迟就像是多人游戏中的延迟或卡顿。
换句话说,它是你的操作到达游戏服务器(Server)(或其他玩家)并且服务器的响应返回到你的设备所花费的时间。
你在玩一款赛车游戏,你按下“加速”按钮。在你按下按钮后,游戏中你的车加速所花费的时间就是延迟。它是你的动作和游戏反应之间的延迟。
低延迟对于多人游戏是有益的,因为它意味着动作几乎会立即发生。相反,高延迟会导致延迟,并使游戏的乐趣降低。在某些情况下,高延迟甚至可能使游戏无法进行,特别是在需要分秒必争的快节奏游戏中。
以下是一些可能影响延迟的因素:
距离:
你距离游戏服务器越远,数据往返的时间就越长。可以把它想象成向一个远方的朋友发送消息 —— 得到回复需要更长的时间。
互联网速度:
互联网连接速度可以影响延迟。更快的连接可以更快地传输数据,从而减少延迟。
服务器性能:
服务器的性能也起着重要作用。如果服务器负载过重或速度较慢,它可能会给游戏引入延迟。
数据包
信息被划分成数据包以通过网络发送。
可以将其想象成拼图的小块。它们被发送,在另一端被组装起来,并相应地采取行动。
数据包的工作原理工作原理如下:
数据分割:
当你通过互联网发送信息时,它会被分解成小数据包。每个数据包包含你正在发送的数据的一部分,比如视频的一部分、一封电子邮件或游戏命令的一部分。寻址:
每个数据包都带有发送者的地址、接收者的地址和其他细节,就像你在信封上写地址一样。发送和路由:
这些数据包被发送到互联网上,它们可以经过不同的路由到达目的地。想象每个数据包就像一辆汽车在不同的道路上行驶,以到达它的投递地址。重组:
当数据包到达目的地时,它们将按正确的顺序重新组装,以重建原始数据。这就像收到拼图的所有部分并将它们组合在一起以看到完整的图像。
数据包在网络中被用于确保数据可以高效可靠地通过互联网发送。
它们小巧易管理,这使得数据能够快速通过互联网复杂的设备和连接网络。
如果一个数据包丢失或延迟,系统可以处理这个问题,而不会影响整个传输。
这样,即使一些数据包遇到障碍或采取更长的路线,你的数据仍然可以到达目的地。
协议
TCP(传输控制协议)和UDP(用户数据报协议)是两种不同的通信协议,各自具有优缺点。
游戏开发者通常根据游戏的特定需求在它们之间进行选择。以下是它们与多人游戏相关的情况:
TCP(传输控制协议):
可靠性:
这个协议就像一次可靠的对话。它确保数据包按正确的顺序到达目的地。对于那些事件顺序至关重要的游戏(如策略游戏或回合制游戏),这是至关重要的。它保证了所有的动作都以正确的顺序被服务器和其他玩家接收到。
确认:
TCP要求接收方确认数据的接收,以便发送者知道数据是否已传送。在游戏中,这种确认有助于确保所有的动作、聊天消息和游戏更新都能可靠地接收和处理。
较慢:
由于其可靠性机制,与UDP相比,TCP可能会引入一些延迟,称为延迟。在快节奏的动作游戏中,这种额外的延迟可能会被注意到,并影响玩家的体验。
UDP(用户数据报协议):
更快:
UDP更像是一张快速的便笺。它更快,但可靠性较低。当设备使用UDP时,它们发送数据时不太担心数据是否完美到达。它更快,因为它没有与TCP相同的可靠性和确认机制。在快节奏的动作游戏中,其中分秒必争的反应至关重要时,UDP可以提供更具响应性的体验。
可靠性较低:
UDP不保证数据会按正确的顺序接收,并且不保证每个数据都会到达目的地。一些数据包可能会丢失,或者它们可能会以错误的顺序到达。
用于实时游戏:
许多实时和动作导向型的游戏,如第一人称射击游戏、赛车游戏和大逃杀游戏,使用UDP,因为速度和响应性比确保每个数据都被接收更为重要。
总结
总之,TCP更可靠但可能会引入一些延迟,因此适用于准确性和事件顺序至关重要的游戏。
UDP牺牲了一些可靠性,以换取速度,因此更适用于快节奏、实时多人游戏。
游戏开发者通常根据游戏的特定要求和设计选择其中之一,甚至结合两者使用。
往返时间(RTT)
RTT(Round-Trip Time)是多人游戏中的一个重要概念,指的是数据包从你的计算机到游戏服务器再返回的时间。
RTT对多人游戏的影响如下:
延迟测量:
RTT是延迟的一种度量。在游戏中,较低的RTT意味着较少的延迟,而较高的RTT意味着更多的延迟。较低的RTT值是理想的,因为它们使游戏感觉更加响应。游戏响应性:
在快节奏的多人游戏中,比如第一人称射击游戏、赛车游戏或实时策略游戏,低RTT至关重要。它确保你的动作,比如射击对手或移动角色,能够被服务器快速注册,并且你能够迅速在屏幕上看到结果。服务器选择:
当你连接到一个多人游戏时,通常会选择一个RTT最低的游戏服务器。这确保你在一个物理上距离你更近的服务器上进行游戏,减少了数据往返所需的时间。许多游戏允许你选择服务器,或者自动连接到RTT最佳的服务器。Ping:
“Ping”是用来测量RTT的命令。当你“ping”一个服务器时,你实际上是向它发送一个小消息,并测量接收到回复所需的时间。结果就是你的ping时间,它经常显示在在线游戏中,以帮助你评估你的连接质量。
序列化
序列化是将复杂的游戏数据,比如玩家位置、角色属性或其他游戏中的信息,转换成一种可以在网络上传输的格式的过程。
可以将其想象成将数据打包,以便可以从一个设备高效地发送到另一个设备,类似于将消息翻译成通用语言以便于交流。
以下是序列化的重要性及其工作原理:
- 数据传输
在多人游戏中,玩家的动作和游戏更新需要实时地传达给其他玩家和游戏服务器。这些数据可能非常复杂,包括角色的三维位置、游戏对象的状态等等。 - 效率
序列化旨在使这些数据紧凑且高效地进行传输。它将数据转换为一种标准化的格式,易于通过网络发送,从而最小化数据量,并确保它能够快速传输。 - 反序列化
在接收端,序列化的数据会被“反序列化”,也就是将其转换回其原始、可用的形式。这就像接收者将消息翻译回他们的语言以便理解一样。
同步机制
在多人游戏中,同步指的是确保所有玩家在游戏中看到相同的游戏世界,并在同一时间经历相同的事件的过程。
以下是同步的重要性及其工作原理:
一致性:
在多人游戏中,确保所有玩家对游戏世界有一致的视角至关重要。这意味着如果一个玩家击中了一个敌人,所有其他玩家应该看到这个敌人被击中并做出相应的反应。如果同步没有正确发生,玩家可能会看到在游戏中发生不同的事情,这可能会令人沮丧和不公平。时间:
同步还涉及时间。游戏中的事件和动作应该按照正确的顺序和在正确的时刻发生。例如,在赛车游戏中,确保所有玩家在同一时间经历相同的比赛事件(如转弯、障碍和道具),从而确保公平竞争。延迟补偿:
为了实现同步,游戏开发者通常需要补偿玩家和服务器之间传输数据时产生的延迟。例如,如果一个玩家的连接速度较慢,游戏可能需要预测该玩家的动作,以使游戏对所有参与者仍然感觉顺畅。
丢包
数据包丢失发生在你的计算机(客户端)和游戏服务器之间发送的某些数据包未被接收或确认的情况下。
这些丢失的数据包可能是由于网络拥塞或其他网络问题导致的。
在多人游戏的背景下,数据包丢失可能会产生显著影响:
游戏状态不一致:
当数据包丢失时,游戏服务器和玩家可能会失去同步。例如,如果你的角色移动命令丢失,你的游戏内位置将不会与服务器的视图匹配,导致你的动作与其他人看到的不一致。瞬移或抖动:
在某些情况下,数据包丢失可能导致玩家在游戏中出现“瞬移”或移动不稳定的情况。这是因为服务器和其他玩家正在尝试根据最后接收到的数据来估算你的位置。不公平的游戏体验:
在竞争性游戏中,数据包丢失可能导致不公平的优势或劣势。例如,如果一个玩家持续经历数据包丢失,他们的角色可能会变得更难击中,因为他们的动作是不可预测的。
航位推测(DR)
DR是多人游戏中用来估计其他玩家的位置和动作的技术,当网络数据延迟或丢失时使用。
这就像在游戏中预测某人将会在哪里,当你在一段时间内没有收到他们位置的更新时。
以下是DR在多人游戏中的工作原理:
- 预测:
当玩家的设备(客户端)向游戏服务器发送数据时,服务器知道他们的当前位置和动作。然而,数据需要一些时间通过网络传输,在这段延迟期间,游戏中的情况可能会发生变化。 - 估算:
为了保持游戏运行的流畅,服务器估算当数据到达时玩家将会在哪里。这种估算是基于玩家之前的动作和当前游戏状态。就像根据朋友之前的移动来预测在游戏中标签游戏中朋友将会在哪里一样。 - 校正:
当延迟的数据最终到达时,服务器将其与自己的估算进行比较。如果存在差异,服务器可以纠正玩家的位置或动作。这有助于确保游戏世界对所有玩家保持一致。
可扩展性(Scalability)
多人游戏中的可扩展性指的是游戏处理越来越多玩家的能力,确保随着更多参与者加入,游戏体验依然愉快顺畅。
以下是可扩展性的重要性及其工作原理:
玩家基数增长:
多人游戏的目标是随着时间吸引更多的玩家。随着更多人加入并开始游戏,游戏必须能够适应这种增长,而不会出现显著的性能下降。服务器容量:
负责管理游戏世界和玩家互动的游戏服务器需要具备支持更大玩家群的能力。它应该处理更多的同时连接,处理更多的游戏数据,并在玩家数量增加时保持响应性。网络基础设施:
可扩展性也涉及到网络基础设施。这意味着网络技术和服务器架构应设计为能够处理更多的流量和连接,随着玩家基数的增长。负载测试:
游戏开发者通常进行负载测试来确定游戏的可扩展性。这涉及模拟大量玩家,并分析在高负载下游戏及其基础设施的表现。
信息安全
多人游戏中的安全性涉及保护游戏、玩家和整体游戏体验免受各种威胁,特别是作弊、黑客攻击和未经授权的访问。以下是安全性的重要性及其工作原理:
防作弊:
作弊可能会严重干扰多人游戏。作弊者可能使用第三方软件或黑客手段获取不公平的优势,比如透视墙或自动瞄准。安全措施,如反作弊系统,被设置为检测和阻止此类活动。账号保护:
玩家通常拥有带有有价值的游戏内物品、角色和进度的账户。这些账户需要防止未经授权的访问。安全功能,如双因素认证(2FA)和强密码要求有助于保护玩家账户。服务器安全:
游戏服务器本身需要安全保护,以防止未经授权的访问、数据泄露和其他网络攻击。一个受到威胁的服务器可能会导致游戏体验受到损害。安全交易:
在玩家可以购买游戏内物品或货币的游戏中,安全的支付处理对于保护金融信息并防止欺诈交易至关重要。玩家举报:
游戏通常提供给玩家举报不端行为(如作弊或骚扰)的工具。有效的审核和响应机制是保持积极友好的游戏社区的安全策略的一部分。网络安全:
支持多人游戏的网络基础设施也应该是安全的,以防止分布式拒绝服务(DDoS)攻击和其他基于网络的威胁。游戏代码和数据安全:
保护游戏代码和数据的完整性对于防止篡改、黑客攻击和引入恶意代码以干扰游戏或伤害玩家至关重要。