首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MultiPlayer -服务器通信,该传输什么

MultiPlayer -服务器通信,该传输什么
EN

Stack Overflow用户
提问于 2020-07-09 10:48:41
回答 1查看 131关注 0票数 1

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

所有这些都是Java中的jappens :我不确定如何处理服务器通信。目前,我的world对象被保存为包含自写类"Entity“的ArrayList。它是通过将实体的每一幅图像按照其坐标绘制到框架中来显示的。所有这些都很好。以下是一个问题:

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

我想我读过一些关于外包给本地mashine的文章,但另一方面,我认为如果所有的事情都发生在服务器上而不是客户机上,世界信息的传输就会更快。

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-09 12:57:02

在多人游戏中,速度是第一优先。任何增加开销、减慢速度、需要加载或永久传输大数据块的内容都要不惜任何代价。

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

PLAYER_A:

posX : 3,

posY : 3,

posZ : 4,

rotX : 30°,

rotY : 60°,

rotZ : 10°

为了避免向服务器发送6条消息(然后服务器向其他玩家广播),我们发明了四分卫(6维对象)。但我怀疑java是否能开箱即用,所以您必须自己想出一个解决方案。您也应该考虑诸如“前进速度”和“跳跃速度”这样的东西,因为在客户端的mashine上计算这个比较容易。

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

服务器现在知道"player a在xyz,面向abc“。

然后服务器将此放松给其他玩家,他们希望及时获得信息(所以总是尝试使用UDP,忽略数据包丢失),并将计算和动画在他们的一方。

如果延迟足够小(又名20 is f.e.),玩家将体验“实时”(虽然没有实时)。

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

编辑:当然,您还需要一个更新()例程,定期向服务器发送世界对象信息,所以f.e。树的位置等。虽然客户端可以在这些实体看不到时(我真的鼓励您这样做),但服务器仍然需要知道完整的地图布局(也就是说,没有纹理和东西,很快就会变得很大)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62813175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档