欢迎光临散文网 会员登陆 & 注册

NavalArt开发进度 – 多人游戏和航母

2023-01-17 17:37 作者:NavalArt  | 我要投稿

各位舰长大家好,距离上一次官方的开发进度帖子更新已经有一段时间了。除开游戏去年上一次的0.9大版本更新,每隔一段时间游戏的测试版也能收到定期的更新(如果您还不知道怎么启用测试版,您可以在游戏库中右键点击属性选项,并使用测试代码“navalarttest”)。

对于已经启用了测试版的舰长来说,您可能已经注意到测试版已经几周没有收到新的更新了,这是因为目前我在为游戏加入多人游戏的框架,而加入框架需要改动游戏一些非常底层的代码。

【为什么是多人游戏?】

一开始,我在航母功能上花了一段时间来构思并测试将要在航母更新中加入的新功能,同时我也在试图加入多人游戏一些基本的功能来为之后的更新做准备,然而我发现游戏现在的运行的机制不太适合在之后的更新中直接加入多人游戏,如果进行暴力移植的话将会产生许多麻烦,并且游戏目前的防空,导弹,飞行器机制虽然在本地运行良好,但是他们其实并无法在多个玩家之间进行同步,原因将会在下文进行更详细的阐述。

这可能也是许多著名的沙盒游戏,例如坎巴拉太空计划,简单飞机没有官方多人游戏的原因:一个多人游戏从一开始开发最好就是基于多人的,多人游戏所需要的运行逻辑和单人并不相同。这对于一整个独立游戏开发组来说可能都是一个难题,更不用说目前游戏开发的主要任务只有我来承担。 但是既然多人游戏已经被加入路线图了,开发者就不会食言,我选择接受挑战。

所以事情变得棘手了,如果我选择在游戏中先加入航母系统的话,在航母系统之后的多人游戏更新中,我又要把航母系统和现在所有的系统一样重写一遍来贴合多人联机的需求。所以我决定把多人游戏作为游戏开发进程中的更高优先级的任务。好消息是,如果一些都顺利的话,具有基本的甲弹对抗,鱼雷的Steam联机版本将会在二月初和大家见面。届时我将会开启一个新的公开测试版,舰长们将可以和自己的朋友一块使用自己的设计进行游玩了。

【存在的挑战】

因为NavalArt是一个沙盒游戏,我们的玩家将可以自由设计他们的战舰,也许有人会在一艘战舰上放置许许多多的武备,例如炮塔,鱼雷发射器,导弹或者飞行器。举例来说,您可以想想您曾经玩过的一些多人战争游戏,在一局游戏中,将不会有许多玩家进行对抗,除非在背后有一个远程专用服务器在使得战局同步与运行。NavalArt的开发目标是使用Steam的P2P网络来实现联机游玩,它所能提供的网络带宽更少,连接更不稳定,所以在玩家之间进行通信并且同步所有单位在目前的情况下是一个不可能实现的任务。

【数学】

举例来说,如果有200架飞机存在与一场对局中,游戏以10Hz的频率在玩家之间同步这些飞机的位置和旋转,也就是每秒十次,那么:

位置: 12字节
旋转: 12字节(实际上由于它是一个四元数,是16字节)
所以每架飞行器需要24字节来同步它当前的状态,当我们把它放到公式中:

(12+12)*10*200 = 48000 字节/秒 = 46.875 KB/秒

可能我们刷视频的时候有时候网速占用能上到MB,但是这对于游戏来说是一个非常大的数值,举例来说,一个10vs10的CS:Go休闲对局所使用的流量是 60 KB/秒,一个典型的基于Steam P2P的游戏如果想要进行流畅的游玩的话,它的流量占用大约是30KB/秒,更不用说玩家可能在他们的船只上放置超出200架飞机。

【解决方案】

对于炮塔和鱼雷发射器来说,问题并不是很大,因为炮塔和鱼雷的弹道除开中间的误差计算以外,其他部分都是确定性的,它们具有确定的初速度和确定的发射角度和地点,所以主持对局的玩家的客户端作为服务器,它只需要在炮弹发射的时候告诉所有玩家的游戏,在xx地生成鱼雷/炮弹,然后所有客户端同时在本地模拟弹。当炮弹/鱼雷击中物体的时候,服务器告诉所有客户端,销毁这个物体。鱼雷和炮弹的坐标并不需要再所有时候进行同步。

对于导弹和飞行器来说,情况就不一样了。你可能曾经玩过一些RTS也就是即时战略游戏,他们使用一种叫做deterministic lockstep的技术,翻译过来叫做确定性锁步。使用这项技术的游戏,无论它在谁的电脑上运行,对于同样的用户输入操作,它所给出的输出,也就是游戏中的表现都是一样的。所以,它们可以只在网络上同步用户的操作,例如框选单位,进行攻击,而同步操作并不需要怎么使用网络,所以使用此项技术的游戏进行联机只需要使用很少的流量。(Steam上一款著名的游戏《异星工厂》同样使用了此项技术来同步数以万计的单位)

既然这项技术这么好,您可能会想,为啥我们不在NA中也加入这个功能? 现实是,在NA中加入这项功能并不是十分现实。

第一,NavalArt使用浮点来进行数学计算,浮点具有一个特性,就是当数值开始变大的时候,它会产生一些误差,这些误差随着时间的积累会使得最终误差变得很大,所以在相同的用户输入下,例如将所有飞行器移动到另外一地,飞行器到达目标的时间和地点将可能每次都变得不同,结果将不是确定性的。同时,确定性锁步要求所有联机玩家的游戏都使用相同的速度和频率运行,这将产生许多致命的缺点。如果您之前玩过一些RTS游戏的话,您可能有时候会碰到游戏突然变得卡顿并提示“XX玩家正在使得游戏变慢”,抑或是游戏突然掉线并提示“您已经失去同步”。同时,也有许多其他原因使得我们不能使用这项技术。

为了解决这个问题,我们需要缩减对珍贵的网络流量带宽的占用, 这将意味着在现有的导弹和飞行器的机制基础上直接加入多人联机游戏将是基本上不可能的,他们需要进行方向性的重制,但是这将不会需要太久的时间,因为例如动画的一些代码可以在重制中被重用。这也是下一个多人测试版不会具有导弹和飞机的实际功能的原因,因为直接在网络中使用单机代码的话会产生bug。

您可能也注意到在现有版本中,飞机会直接穿山而过。在之后的飞行器重制中,这个问题也将会被解决。目前打算是将整个地图坐标网格化,这样为飞行器加入寻路和避障就会更容易了。飞机将也可能实现编队飞行,因为它们可以检测哪个网格被队友飞行器占据了,从而避开被占据的坐标。

使用网格系统也将大大削减网络资源的占用,因为我们需要同步的只有网格坐标,当我们用比特,也就是2的n次幂来同步他们的时候,很显然他们会比一整个12字节的三维向量要更小,后者是整整12*8为96比特。飞机的运动和旋转可以通过在网格坐标之间进行插值来计算。

也有其他许多技术可以被用在多人游戏上,例如增量同步,数据压缩。所以请您再给予一点耐心,游戏将不会被放弃,它在未来也会如过去几年般变得越来越完善。

【最后】

我希望您喜欢这篇描述了游戏开发在目前阶段碰到的困难和可能的解决方法的文章,下一篇更新日志将会在不久后的多人游戏公开测试版本发布。

(图片作者:Julius_Tetsuo、肄业遮目)

NavalArt开发进度 – 多人游戏和航母的评论 (共 条)

分享到微博请遵守国家法律