在现代多人游戏中,巨大的静态对象(如环境)是否从服务器传输到客户端?


18

我有一个权威的系统,当玩家加入比赛时,它会获取所有已经生成的对象-本身(客户端)生成的对象。

看起来像这样:

  1. Client 将访问令牌发送到 Server
  2. Client 收到来自 Server
  3. Client 将场景切换到游戏场景
  4. Server发送玩家,板条箱,可以与之互动的对象,以便client生成并显示它们。

但是地面物体呢?现在,我在服务器和客户端上具有完全相同的场景-以一个静态平面作为地板。目前,我正在添加新的东西,树木,楼梯并一起构建东西。

我以为-我们很好。但是环境也应该不同步吗?是否以某种方式联网?由服务器拥有?

让我们来League of Legends

在此处输入图片说明

这是一个静态环境,可能是一个组合的网格(楼梯,草地,墙壁,商店)。但是它是真正保留在客户端上还是由服务器在加载屏幕期间发送?


1
您甚至可以从可以为联赛角色和环境添加自定义外观的角度考虑这一点。您无需将它们发送给服务器,它们会在本地显示,因此可以断定它们是在本地存储和呈现的。Aslo,它们不会影响游戏玩法,如果您询问碰撞,它们是服务器和客户端的混合体,因此玩家无法作弊并无法穿越墙壁。
坦率的月亮_Max_

Answers:


41

在大多数情况下,不,任何类型的艺术品都不会常规地通过网络发送。通常,所有客户将在本地拥有相同的内容资产。可能会有代码通过校验内容或类似内容来确保是这种情况。如果您担心用户篡改其某些客户端内容,则可以实施类似的系统。

服务器可能会向客户端发送指令,指示其应显示或隐藏某些资产,但不会发送资产的实际数据。实际上,这太浪费和太慢,并且可能会导致可用数据有限的人们的实际问题。

在某些情况下,如果某种程度上将较小的资产视为“破坏者”或其他任何东西,则可以将其整体流式传输。但这并不常见。一般来说,你看到的是一个游戏可以下载的补丁,或任何内容,但仅将在启动时打补丁的过程发生一次。不在游戏中。


21
请注意,此答案仅解决静态资产。动态/玩家生成的资产(例如,玩家可以上传的Minecraft世界块或MMORPG公会徽标)必须进行传输。但是即使这样,通常也要尽量减少必要的数据量(以继续Minecraft示例:发送块更新而不是整个块,仅指示块类型/状态和已更改的坐标)和/或在客户端缓存数据。
hoffmale

@hoffmale是的,很好;这个问题提到风景在最后是静止的,所以我不打算提出这一点,但这是一个很好的观点。

3
如果资产是破坏者,则通常该资产在客户端上进行加密,并且在需要资产时将解密密钥从服务器传输到客户端。
格兰特·戴维斯

4
例如,如果您需要在地图上随机放置树,而不是将树的坐标发送给客户端,而是将(随机数生成器的)种子发送给客户端。
格兰特·戴维斯

5

取决于多种因素,包括游戏的类型(我会在这里假设RTS,尽管也会想到开放世界MMO)。基本的,从本地到玩家的地形状态要么通过连接发送,要么作为客户端资产的一部分-考虑一个RTS游戏,其中地图随客户端一起提供,或者在游戏开始之前下载。

实际上,通常不会发送网格,因为在大多数RTS情况下它已经在客户端上了。是否发送碰撞图,这对于使两者保持同步至关重要,这是另一个问题。但是在大多数RTS中,它会再次预先存储在客户端上。

因此,实际上,这完全取决于您的RTS附带的内容,是在播放时间之前还是在游戏开始时下载地图。

之后,有几种保持同步的典型方法:

  • 将增量发送给客户端-最常用和最有效的方式来使本地/客户端环境与服务器保持最新;
  • 校验和偶尔会从服务器发送到客户端,或者从客户端发送到服务器,以确保世界状态确实匹配。
  • 有时,重新发送完整状态以重新同步客户端-通常是由于诸如浮点漂移之类的技术问题。

4

关于您所问的确切问题,我不知道英雄联盟是如何具体处理的。我从未玩过该游戏,所以我无法建议它是否需要。

但总的来说,您的问题的答案非常简单明了:

如果数据是静态的,并且您确定永远不会更改(缺少定期的完整游戏更新,但这是单独的),那么您为什么要发送这些额外的数据?通常,您尝试避免发送任何可以避免的内容。仅在需要通信时才发送数据。

另一方面,如果数据会随着时间变化,或者如果您只想将该选项保持打开状态,那么您真的有什么选择吗?对于这种情况,您必须发送数据。否则,客户将没有所需的东西。

这不仅适用于地形数据,还适用于所有网络通信。一切


2

没有。

我已经做了很多关于英雄联盟的挖掘工作,包括英雄模型,店主,一般地图背景以及事后添加的绒毛动物(例如,一些岩石上的小松鼠和蜗牛)中的所有内容。河流)保留在客户端。客户端拥有所有这些模型的事实是LoL达到数GB的原因之一。

将所有这些数据从服务器传输到客户端将是一件令人头疼的事,更不用说通过带宽使用来咀嚼,而只是在下一场比赛中再做一次。

那么如何解决呢?每个玩家仅将对游戏中其他玩家重要的数据发送到服务器。没有人需要知道您还有5秒钟的Q冷却时间,还是Deep Terror Thresh Skin为您制造气泡。在游戏中传递的东西是诸如Vel'Koz投Q,Viktor移到左侧等。

更明确地说,关于加载屏幕,在您启动时,发生的事情包括中间补丁补丁,每个玩家都需要在游戏开始之前与防暴服务器进行交谈,安全连接握手和防作弊协议。

注意:

如果您想看看客户端有什么内容,因此服务器没有通过,请找到C:\ Riot Games \ RADS \ lol_Game_Client \ Projects文件夹(可能有点小,对不起,我是我现在正在处理内存),然后在线找到.RAF文件解压缩器。然后,您可以看到本地存储的所有内容,例如加载屏幕飞溅和皮肤纹理,甚至是冠军骨骼。


1
似乎实现此目的的明显方法是(从专用资产服务器请求)客户端尚未存储在本地的任何资产,并在接收到资产时将其永久(半)添加到其中。磁盘上的本地持久存储。这样,资产仅下载一次,并且仅在实际需要时才下载。(一旦可行,一种优化将是向客户端的本地商店中预填充很可能需要的资产。这将减少首次连接时游戏的启动时间,但会增加游戏的安装程序包的成本)
Jeremy Friesner

1
@JeremyFriesner为什么那是显而易见的方式?这听起来比本文中概述的当前实现更糟,后者是您提前安装所有资产,以便在需要时可以立即使用它们。对于单人游戏,这可能行得通,尽管我认为很多人宁愿更长的安装时间(和更多的磁盘空间使用量),而不是不得不在游戏过程中不断等待新资产下载。
安东尼·格里斯

2
对于多人游戏?绝对的灾难。您不想让其他所有玩家等待开始游戏,因为一个人必须下载一些他们迄今为止不需要的资产。
安东尼·格里斯

1
@AnthonyGrist这就是为什么许多游戏(例如英雄联盟)都要求玩家在加入队列以找到比赛之前先下载所有游戏资产。这比在等待大量资产时游戏滞后要好得多。请记住,在这种游戏类型中,玩家会因ping降低10毫秒而感到兴奋,并且经常以<50毫秒的ping进行游戏,并且可以判断出是否跳到100到150范围。在游戏期间等待获取资产将是MOBA或FPS的灾难,如果发生在错误的时间,它甚至可能会改变游戏的结果。
JustWannaFly

@AnthonyGrist(续)我想您可以这样考虑。在某些多人/竞争性游戏中,玩家通过让客户端负责所有更新和进入队列,从而将更长的加载/修补/安装时间换为更实时的游戏体验。这样一来,只有需要资产的特定玩家才能等待,除非他想参加预制派对,然后派对中的所有玩家都必须等待进入队列以寻找对手
JustWannaFly

1

上古卷轴在线》就是一个没有做到这一点的例子,它使客户相信地面高度

黄金矿工使地面下降了几英尺。然后,他们可以在地形“下方”走来走去,并从下方开采资源,而不会被PC看到或受到NPC的攻击。

类似的编辑使他们可以平滑悬崖,以便他们可以走上悬崖,在静态墙壁下移动或移动,穿越所有静态物体等。

从本质上讲,服务器信任客户端有关播放器位置的信息,因此计算每个服务器上针对所有静态对象的所有碰撞在服务器端的碰撞将是非常沉重的。

但是,在类似Furcadia的基于图块的游戏中,情况有所不同:您进入的每个方块都具有服务器端的可移动性,并且服务器不需要信任客户端的任何内容:服务器知道并验证每个动作和用户操作,并且客户端仅在服务器告知结果后才显示操作。


1
TL; DR:始终假设客户是在说谎,作弊,bus鸟。但是对所有内容的服务器验证都会降低您的容量。
Draco18s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.