多人游戏 - 服务器通信,传输什么
MultiPlayer - Server communication, what to transfer
正如标题所暗示的,我目前正在尝试创建一个小型多人游戏作为一个项目,只是为了了解更多所需的所有技能。
所有这些都发生在 Java 中:
我不确定如何处理服务器通信。目前我的世界 objects 被保存为一个 ArrayList,其中包含一个自写的 class “实体”。它是通过将每个图像从一个实体绘制到一个框架中,根据它的坐标来显示的。所有这些都很好。问题来了:
随着世界的每一次变化,例如任何实体的移动,我应该将整个 ArrayList 的实体传输给每个玩家,我应该只发送更改然后只更新更改的实体,还是应该在服务器上而不是本地 mashine 上保存世界并发送导致的输入变化,例如WASD 用于玩家移动?
我想我读了一些关于尽可能多地外包给本地机器的东西,但另一方面我假设如果一切都发生在服务器而不是客户端上,世界信息的传输会更快。
提前致谢
在多人游戏中,速度是第一要务。任何以某种方式增加开销、减慢速度、需要加载或永久传输大数据块的事情都要不惜一切代价避免。
我肯定会在服务器上保存世界坐标和东西,而纹理和模型等应该留在客户端。
现在客户端可以加载世界并在那里注入所有东西,构建一个漂亮的图形用户界面,所有这些东西。这不会绘制网络连接。
但是,服务器必须知道每个 3d 对象的四分之一数(假设您使用 3d),因此 f.e。 :
PLAYER_A:
posX : 3,
位置:3,
位置:4,
旋转X:30°,
旋转 : 60°,
旋转Z:10°
为了避免向服务器发送 6 条消息(然后服务器将其广播给其他玩家),我们发明了四元数(6 维对象)。但是我怀疑 java 可以开箱即用,所以你必须自己想出一个解决方案。您也应该考虑“forwardspeed”和“jumpvelocity”之类的东西,因为在客户端的机器上计算起来更容易。
现在,抓取一个对象,无论您如何称呼它,并将其发送到服务器。
服务器现在知道“玩家 a 在 xyz,面向 abc”。
服务器然后将其转发给其他玩家,他们希望及时获得信息(因此始终尝试使用 UDP 并忽略数据包丢失)并将在他们这边计算和制作动画。
如果延迟足够小(也就是 20 毫秒 f.e),玩家将“实时”体验到这一点(尽管没有真正的实时)
Tl;dr : 始终尝试尽可能少地向服务器发送,并让服务器将其广播给客户端。然后他们可以自己“重新计算”动画。
编辑:
当然,您还需要一种定期向服务器发送世界对象信息的 update() 例程,所以 f.e。树木的位置等。虽然客户端可以在看不见这些实体时将它们消失(我真的鼓励你这样做),但服务器仍然需要知道完整的地图布局(也就是说,没有纹理和东西,这很快就会变大)
正如标题所暗示的,我目前正在尝试创建一个小型多人游戏作为一个项目,只是为了了解更多所需的所有技能。
所有这些都发生在 Java 中: 我不确定如何处理服务器通信。目前我的世界 objects 被保存为一个 ArrayList,其中包含一个自写的 class “实体”。它是通过将每个图像从一个实体绘制到一个框架中,根据它的坐标来显示的。所有这些都很好。问题来了:
随着世界的每一次变化,例如任何实体的移动,我应该将整个 ArrayList 的实体传输给每个玩家,我应该只发送更改然后只更新更改的实体,还是应该在服务器上而不是本地 mashine 上保存世界并发送导致的输入变化,例如WASD 用于玩家移动?
我想我读了一些关于尽可能多地外包给本地机器的东西,但另一方面我假设如果一切都发生在服务器而不是客户端上,世界信息的传输会更快。
提前致谢
在多人游戏中,速度是第一要务。任何以某种方式增加开销、减慢速度、需要加载或永久传输大数据块的事情都要不惜一切代价避免。
我肯定会在服务器上保存世界坐标和东西,而纹理和模型等应该留在客户端。 现在客户端可以加载世界并在那里注入所有东西,构建一个漂亮的图形用户界面,所有这些东西。这不会绘制网络连接。 但是,服务器必须知道每个 3d 对象的四分之一数(假设您使用 3d),因此 f.e。 :
PLAYER_A:
posX : 3,
位置:3,
位置:4,
旋转X:30°,
旋转 : 60°,
旋转Z:10°
为了避免向服务器发送 6 条消息(然后服务器将其广播给其他玩家),我们发明了四元数(6 维对象)。但是我怀疑 java 可以开箱即用,所以你必须自己想出一个解决方案。您也应该考虑“forwardspeed”和“jumpvelocity”之类的东西,因为在客户端的机器上计算起来更容易。
现在,抓取一个对象,无论您如何称呼它,并将其发送到服务器。
服务器现在知道“玩家 a 在 xyz,面向 abc”。
服务器然后将其转发给其他玩家,他们希望及时获得信息(因此始终尝试使用 UDP 并忽略数据包丢失)并将在他们这边计算和制作动画。
如果延迟足够小(也就是 20 毫秒 f.e),玩家将“实时”体验到这一点(尽管没有真正的实时)
Tl;dr : 始终尝试尽可能少地向服务器发送,并让服务器将其广播给客户端。然后他们可以自己“重新计算”动画。
编辑: 当然,您还需要一种定期向服务器发送世界对象信息的 update() 例程,所以 f.e。树木的位置等。虽然客户端可以在看不见这些实体时将它们消失(我真的鼓励你这样做),但服务器仍然需要知道完整的地图布局(也就是说,没有纹理和东西,这很快就会变大)