【问题标题】:Multiplayer Game Networking多人游戏网络
【发布时间】:2017-01-23 13:47:48
【问题描述】:

我正在开发的游戏目前正在使用ServerSocket和Socket来提供多人游戏。当它不在本地运行时它会滞后很多,所以我想知道我是否应该重新制作多人游戏结构以通过 TCP(ServerSocket,Socket)和 UDP(DatagramSocket)发送。目前如前所述,即时通讯仅使用 TCP,并且在本地未运行时,它每秒仅发送大约 60 个数据包(30 个接收和 30 个发送)。

在服务器和客户端之间发送的信息:
运动、交易、ItemUsage、EnvironmentDetails 等等。

所以我的问题是:

如果我同时使用 TCP 和 UDP 而不是只使用 TCP,会有很大的不同吗?

如果我同时切换到 TCP 和 UDP,我应该在每个协议中发送什么?

提前致谢!

编辑:

客户:

实例化:this.out = new ObjectOutputStream(new BufferedOutputStream(this.requestSocket.getOutputStream())); this.in = new ObjectInputStream(new BufferedInputStream(this.requestSocket.getInputStream()));

发送:

this.out.writeObject(temp.toString()); this.out.flush(); Temp 是一个 JSONObject

服务器:

实例化:this.out = new ObjectOutputStream(new BufferedOutputStream(c.getOutputStream())); this.out.flush(); this.in = new ObjectInputStream(new BufferedInputStream(c.getInputStream()));

发送:this.out.writeObject(temp.toString()); this.out.flush(); Temp 是一个 JSONObject

【问题讨论】:

  • UDP 可能会丢包,因此您可能会丢失数据。这会对你的游戏产生负面影响吗?我可以看到这可能是一个问题。
  • 嗯,UDP 本身没有错误检查功能,所以理论上它一定会更快,只要您不需要准确的信息流。
  • 也有可能是因为你的代码而滞后,这取决于你的通信代码如何处理事情。你冲洗你的流吗?您以什么格式发送数据等。
  • 如果您发送非常小的数据包,您可能需要设置 TCP_NODELAY 选项。这应该立即发送数据,而不是等待网络缓冲区填满,而是立即发送数据。
  • 非常好的资源,可以更好地理解这一点:gafferongames.com/post/udp_vs_tcp 我还建议阅读他的所有文章,因为它们的内容很好并且与游戏网络相关。

标签: java networking tcp udp multiplayer


【解决方案1】:

如果我同时使用 TCP 和 UDP 而不是只使用 TCP,会有很大的不同吗?

是的。如果您使用 UDP 更新游戏状态,您会发现性能要好得多,因为不会发生数据验证。 UDP 数据包被触发,然后被遗忘。

此外,为了提高性能,请限制您发送的数据量。如果您发送 JSON,则每个字符都是一个完整字节。每秒 30 次更新可能过多,因为这是每 33.3 毫秒更新一次。从这个角度来看,一个 60 Hz 的监视器只会每 16.7 毫秒更新一次。

如果我同时切换到 TCP 和 UDP,我应该在每个协议中发送什么?

当您需要确保您的数据到达服务器或客户端时,通常使用 TCP。当您需要速度时使用 UDP,并且可以潜在地处理丢弃的数据包。如果您使用 UDP,则需要考虑代码中潜在的数据包丢失。

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    相关资源
    最近更新 更多