MultiPlayer-服务器通信,传输内容



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

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

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

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

提前感谢

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

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

玩家A:
posX:3,
posY:3,
posZ:4,
rotX:30°,
rotY:60°,
rotZ:10°

为了避免向服务器发送6条消息(然后服务器将其广播给其他玩家(,我们发明了四分之一数(6维对象(。但我怀疑java能否开箱即用,所以你必须自己想出一个解决方案。你应该考虑像";"前进速度";以及";跳跃速度";同样,因为在客户端的mashine上计算更容易。

现在,获取一个对象,不管您怎么称呼它,并将其发送到服务器。

服务器现在知道";玩家a在xyz,面对abc
然后服务器将其重新发布给其他玩家,这些玩家有望及时获得信息(因此,请始终尝试使用UDP并忽略数据包丢失(,并将为他们计算和动画化。

如果延迟足够小(也就是20ms f.e.(,玩家将在";"实时";(尽管没有真正的实时(

Tl;dr:总是尽量少发送到服务器,并让服务器向客户端广播。然后他们可以";重新计算";动画本身。

编辑:当然,你也需要一个update((例程,它会定期向服务器发送世界对象信息,比如树的位置等。虽然客户端可以在这些实体看不见的时候去寻找它们(我真的鼓励你这样做(,但服务器仍然需要知道完整的地图布局(也就是说,如果没有纹理和其他东西,这很快就会变得很大(

最新更新