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


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


第一个问题:您如何看待这种结构?
下一个问题:如果有一些玩家射击大量子弹(需要发送玩家和子弹位置),则每秒45次可能会从服务器端上传大量数据。
为了限制所需的上传,我考虑过使用view frustum culling并仅发送客户端实际会看到的数据/更新。
现在,我已经看到了KryoNet方法sendToAllTCP并想知道,该方法是否在某种程度上更有效并且可以某种方式仅一次上传数据,而不是每个客户端一次。
我没有网络方面的经验,我真的不认为可以为一个以上的客户端进行1次上传。但可以肯定的是,我问。
那么使用sendToAllTCP发送级别的每个更新是否更有效,或者为每个客户端仅发送一次他们只能看到的内容,效率更高?

最佳答案

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

与服务器的原始发送数据包能力相比,Internet延迟可能会带来性能问题。我现在不会太担心优化TCP连接发送。

10-06 16:04