搜索 Unity

事实还是流言?揭开3个常见的网络代码误区

2021年12月1日 类别 游戏 | 11 分 阅读
netcode unity gaming services
netcode unity gaming services
分享

Is this article helpful for you?

Thank you for your feedback!

与单人游戏相比,制作与发售一款多人游戏往往需要有更多的考虑,游戏中的一切都必须同步到每位玩家的设备上才能产生一个统一的共有游戏状态。 

多人游戏开发的一个核心难题是网络代码(netcode),即处理玩家和服务器之间“怎样”通信、通信“什么”的代码。 

然而,“netcode”这个词向来名声不好,它经常被看作是高延迟和低质量游戏体验的始作俑者。 

今天,我们将深入了解围绕网络代码的几种常见误区,区分流言与真相,让各位可以自信地为下款游戏加上网络联机功能。

什么是Netcode?

Netcode指的是多人游戏开发的“制作”环节,这个术语通常用于概括游戏中处理“客户端到服务器”的联网与同步部分。 

在多人游戏中,服务器和客户端通过在网络上发送数据包来相互通信。为了在相隔甚远的玩家之间建立起一个共同的游戏状态,类似角色移动或物体生成等游戏事件会借助数据包同步到其它客户端。这些负责在网络上发送和接收数据包的系统就是所谓的传输系统(transport)。

虽然开发者可通过调用传输系统的发送功能来手动发送数据包,但缺乏经验的开发者很容易让系统变得不堪重负。 

一个netcode库可借助网络变量和远程程序调用(RPC)等功能,将数据包的发送流程从游戏代码中剥离出来。 

Unity目前有两种网络代码,Netcode for GameObjects(预发布)和Netcode for Entities(实验性)。

chart showing netcode libraries

网络代码三个常见的迷思及真相

1. “我们可以在后期把游戏转为多人游戏”

🚫流言:多人游戏功能可在游戏的开发后期再加。 

真相:多人游戏的实现并不简单。如果你想在游戏中加入多人游戏,应该尽早在设计和开发中考虑妥当。 

为什么?多人游戏几乎触及游戏玩法的每一个方面,自然也就会影响到游戏开发。例如,单人游戏里的背包系统在多人游戏里需要同步到服务器上。

许多在单人游戏中做起来很简单的东西,在多人游戏里就可能没那么简单了。

你有没有想过,为什么大多数多人游戏都使用运动学(kinematic)角色控制器,少有物理互动?之所以如此,是因为即使是最有经验的开发者,也很难在多台设备上应用一个共有的物理模拟或预测模拟结果。

我们建议各位尽早检查游戏功能是否能很好地兼容多人游戏,特别是那些在其它游戏里不太看得到的机制。

Soaring Pixels Games的《Breakwaters在一开始就在游戏中应用了多人游戏,提前的规划对这款小规模合作游戏产生了深远的影响。

 

2. “低延迟总是好的”

🚫流言:多人游戏的延迟越低越好,延迟越低体验就越好。 

真相:虽然低延迟的确能让体验更流畅,但让游戏状态保持一致也同样重要。同步游戏状态所耗费的时间较少,因而对整体体验来说几乎微不足道。 

原因:低延迟不一定总是意味着流畅和一致的体验。  

要想提高游戏的流畅性和一致性,最常用的方法是建立缓冲区。

从网络传入的数据包不会被立即处理,而会被放到一个队列中。客户端会在游戏的每一个tick(即一次模拟更新)从队列中取出一个数据包(理想情况)进行处理,同时保持住缓冲区的大小。

这样,服务器在每个tick发送一个数据包时,客户端也能以同样的速率处理数据包。 

但为什么要这么做呢?如果客户端立即处理掉传入的数据包,不也是每个tick接收一个数据包吗?在完美的网络条件下,这是对的,但在网络上传输的数据包一定会有或长或短的传输延迟。 

每个数据包的往返时间(RTT)会存在着上下波动,这通常被称为抖动(jitter)。缓冲是一种提高延迟、减少抖动的方法,缓冲后的游戏往往有着更高的一致性,玩家体验也更好。

 

实例:许多格斗游戏大多带有快速连按才能放出的招式,玩家一般会通过肌肉记忆来学习这些招式。要让游戏更为公平,很重要的一点是让角色行动与玩家输入达成一致。 

那大多数格斗游戏是如何实现这种一致性的呢?他们以固定的频率来记录玩家输入,然后将输入缓存一小段时间,这样一来,玩家的输入便能一致地反映到游戏的帧上,平均的输入延迟会增加,但游戏也会变得更为一致。

 

虽然更大的缓冲区能让游戏更流畅,但过多的延迟经常会让玩家感到输入与游戏脱节。

目前市面上有多种技术可用于稳定缓冲区、降低延迟的影响。客户端权威的游戏能将本地的输入立即应用到玩家角色上,做到延迟最小化。其他玩家则可以在缓冲区中储存敌对玩家的数据,让对方的表现更流畅。 

虽然这种方法对玩家来说往往感觉很好,但它也可能导致作弊等其他问题。 

因此竞技游戏可以使用一种叫做客户端预测的技术。本地玩家的输入会被立即应用,而服务器则会根据这些输入来预测玩家的行动,然后检查客户端是否执行了预测的动作,在必要时进行纠正。

 

3. “带宽是免费的”

🚫流言:个人宽带合约价太便宜了,意味着网络带宽肯定是免费的。 

真相:带宽不是免费的,不同地区的收费不同,有些地方的收费会明显高于其他地区。

为什么?与商用服务器相比,个人宽带的价格非常便宜。之所以如此,是因为大部分个人用户的带宽用量和使用时长都比较少。商用服务器就非常不一样了。它们通常一天到晚都在运行,游戏的服务器经常需要处理数百名玩家的通信。因此,网络服务公司经常会按每千兆字节收费。

这也意味着降低带宽是节省运营成本的关键。并且,对带宽需求较低的游戏可让网速较慢的玩家也能很好地享受游戏。 

多人游戏卡顿的一个原因是用户自己的网络拥堵。这种情况由于网络直播等大流量内容的火热而变得更为常见,降低游戏的带宽需求于是就更能改善玩家体验。

 

自信地制作多人游戏

开发一款多人游戏不仅极具挑战,也能让人充满斗志。无论是下一款热门大逃杀游戏,还是舒缓的在线合作游戏,了解不同联网模式的细微差别对游戏成功与否至关重要。 

欲了解更多常见的多人联机开发陷阱,可在此处下载完整版电子书。 

并且,别忘了查看Unity的Netcode解决方案说明文档,为下一个多人游戏项目做好准备。 

2021年12月1日 类别 游戏 | 11 分 阅读

Is this article helpful for you?

Thank you for your feedback!