0

我正在考虑创建一个网络游戏。
游戏应该是一个 2D 平台射击游戏,使用 Libgdx 和 Box2D 创建。
对于网络,我计划了以下结构:

  • 服务器和客户端是2个程序
  • 服务器处理所有游戏逻辑
  • 客户端发送键/鼠标输入
  • 服务器对这些做出反应并更新整个级别
  • 服务器发送这些更新(如果可能,每秒 45 次,因此不需要客户端插值)
  • 客户端通过使用接收到的更新获取更新并更新其本地级别/世界
  • 客户在其绘制的东西view frustum

第一个问题:您如何看待这种结构?
下一个问题:每秒45次可能是从服务器端上传大量数据,如果有几个玩家射出很多子弹(需要发送玩家和子弹位置)。
为了限制所需的上传,我考虑使用view frustum culling并仅发送客户端实际看到的数据/更新。
现在我已经看到了该KryoNet方法sendToAllTCP并想知道,这种方法是否更有效,并且可以以某种方式仅上传一次数据,而不是每个客户端一次。
我对网络没有那么丰富的经验,我真的不认为可以为一个以上的客户上传 1 个文件。但可以肯定的是,我问。
那么发送关卡的每次更新是否更有效?sendToAllTCP还是为每个客户发送一次然后只发送他们可以看到的东西更有效?

4

1 回答 1

1

KryoNet 是开源的,你可以在这里看到它在做什么:https ://github.com/EsotericSoftware/kryonet

方法在sendToAllTCP这里: https ://github.com/EsotericSoftware/kryonet/blob/master/src/com/esotericsoftware/kryonet/Server.java#L447

sendToAllTCP方法只是循环 TCP 连接并向每个连接发送相同的数据。源代码中有一条评论说他们应该只序列化一次数据,并多次发送序列化的对象,但它还没有这样做。

通常,通过一次发送将数据发送到多个主机的能力称为“多播”。由于许多原因,它并不普遍可用,仅在高度专业化的情况下才有用。见http://www.tcpipguide.com/free/t_IPMulticasting.htm

您将遇到的性能问题更有可能是互联网延迟,而不是服务器发送数据包的原始能力。我不会太担心优化 TCP 连接发送。

于 2014-05-10T16:15:46.277 回答