【问题标题】:Getting the current game state, and sending it across the internet获取当前游戏状态,并通过互联网发送
【发布时间】:2016-06-16 22:16:42
【问题描述】:

我有一些问题需要回答。我想知道如果我序列化一个对象并将其发送出去,或者如果我转储所需的变量并在服务器端重建游戏状态,性能会有什么不同。我之所以好奇,是因为我正在创建一个游戏,其中物理由客户端和服务器处理并确保它正常工作(并且没有人在黑客攻击),我想知道什么是最好的课程行动。

一些信息: 它是一个使用 Libgdx api 用 Ja​​va 编写的 2D 游戏,我目前使用 netty 作为我的网络后端。

我一直在这里做笔记: http://gafferongames.com/networked-physics/the-physics-simulation/

【问题讨论】:

  • 这是一个非常广泛的主题,可能与 StackOverflow 无关。简单的答案是以最适合您的方式编写代码,然后在发现存在性能问题时进行优化。请注意,“序列化对象”“转储所需的变量并在服务器端重建游戏状态” 本质上是相同的,但在第一种情况下,您使用内置序列化,然后编写自己的序列化代码。
  • 你确实提出了有效的观点,本质上是一样的,我的措辞很宽泛。我想知道序列化是否会引入瓶颈或其他东西,因为我以前从未使用过它。但我会试试看。

标签: java libgdx box2d game-engine game-physics


【解决方案1】:

正如 Jim Garrison 所说,这是一个非常广泛的问题,您应该先编写代码,然后再对其进行优化,但我会给您一些相同的建议。

您可以以任何您想要的方式发送数据,最初这取决于您更喜欢哪种方式。您可以从使用序列化 Java 对象并通过网络发送它们开始。对于序列化数据,我建议您使用像 Kryo 这样的库,与内置的 Java 序列化相比,它的速度非常快。关注link查看各种jvm序列化器的性能。

首先,您可以使用Kryonet 库来编写网络代码。 Kryonet 使用 Kryo 序列化器来序列化您的 Java 对象并通过网络发送它们。它也很容易使用。

稍后您可以继续使用名为Netty 的网络库,它可以让您编写自己的协议。然后正如您所说,您可以编写一些最适合您的协议。将 Netty 与 Google's Protobuf 配对,您将获得一个非常好的带有顶级序列化程序的网络库。我目前也在同时使用它们,我喜欢使用 protobuf 定义自定义消息的方式以及 netty 提供的对 protobuf 的内置支持。

最后,就破解您的游戏而言,这应该是一个完全不同的问题。一旦您的游戏取得成功并且您觉得人们想要破解您的游戏,您就已经获得了足够的知识来了解如何避免这种情况:)

祝你好运!我希望答案为您指明了正确的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-27
    • 2012-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多