首页 > 解决方案 > MultiPlayer - 服务器通信,传输什么

问题描述

正如标题所暗示的那样,我目前正在尝试创建一个小型多人游戏作为一个项目,只是为了更多地了解所需的所有技能。

所有这些都发生在 Java 中:我不确定如何处理服务器通信。目前我的世界对象被保存为一个包含自写类“实体”的 ArrayList。它是通过将实体中的每个图像根据其坐标绘制到框架来显示的。所有这些都很好。问题来了:

随着世界的每一次变化,例如任何实体的移动,我应该将整个 ArrayList 实体传输给每个玩家,我应该只发送更改然后只更新更改的实体,还是应该将世界保存在服务器上而不是本地 mashine 并发送导致更改的输入,例如用于玩家移动的 WASD?

我想我尽可能多地阅读了一些关于外包给本地机器的信息,但另一方面,我认为如果一切都发生在服务器而不是客户端上,那么世界信息的传输会更快。

提前致谢

标签: javasocketssoftware-designmultiplayergame-theory

解决方案


在多人游戏中,速度是第一要务。任何以某种方式增加开销、减慢速度、需要加载或永久传输大数据块的事情都是不惜一切代价避免的。

我肯定会将世界坐标和东西保存在服务器上,而纹理和模型等应该保留在客户端上。现在客户端可以加载世界并在那里注入所有东西,构建一个漂亮的 gui,所有这些东西。这不会绘制网络连接。但是,服务器必须知道每个 3d 对象的四分位数(假设您使用 3d),所以 fe :

PLAYER_A:
posX:3,
posY:3,
posZ:4,
rotX:30°,
rotY:60°,
rotZ:10°

为了避免必须向服务器发送 6 条消息(然后服务器将其广播给其他玩家),我们发明了四元数(6 维对象)。但我怀疑 java 是否可以开箱即用,所以你必须自己想出一个解决方案。您还应该考虑诸如“forwardspeed”和“jumpvelocity”之类的东西,因为在客户端的机器上计算它更容易。

现在,抓取一个对象,无论您如何称呼它,并将其发送到服务器。

服务器现在知道“玩家 a 在 xyz,面向 abc”。
然后服务器将其转发给其他玩家,他们希望及时获得信息(因此始终尝试使用 UDP 并忽略数据包丢失),并将在他们这边计算和动画。

如果延迟足够小(也就是 20ms fe),玩家将“实时”体验到这一点(尽管没有真正的实时)

Tl;dr :始终尝试尽可能少地向服务器发送,并让服务器将其广播给客户端。然后他们可以自己“重新计算”动画。

编辑:当然,您还需要一种定期将世界对象信息发送到服务器的 update() 例程,因此可以确定树的位置等。虽然客户端可以在这些实体看不见时使它们消失(并且我真的鼓励你这样做),服务器仍然需要知道完整的地图布局(也就是说,没有纹理和东西,这很快就会变得很大)


推荐阅读