【问题标题】:What are possible ways to send Game/Simulation State with javaNIO?使用 javaNIO 发送游戏/模拟状态的可能方法是什么?
【发布时间】:2011-03-24 21:21:45
【问题描述】:

我经常听到这个短语在网络游戏/模拟领域“发送游戏状态或模拟状态”,我的问题是源于此,我真的需要知道如何? .

我正在研究实时网络物理模拟,我的问题只是: *模拟状态如何从服务器传输到客户端*? (最小模拟状态是模拟物体的坐标X,Y=))

可能的场景:以简单的球模拟为例,服务器正在移动多个球,应将每个球的坐标发送给客户端进行绘制和更新模拟,每个球应根据从服务器接收到的坐标移动。

谢谢,

吉比拉拉

P.S:请不要提及任何基于字符串的解决方案,我正在寻找可适用于不同物理模拟的通用机制。

【问题讨论】:

    标签: java network-programming network-protocols nio


    【解决方案1】:

    在快节奏的动作游戏中,动态对象的状态在结构中不断发送。状态我的意思是它通常是位置和旋转。根据模型的架构,它可以是服务器不断推送状态,或者在状态发生变化时发送。更多的时候是第一个。当在一段时间内没有收到状态时,就会发生游戏延迟。状态还可以有速度、加速度等参数。实际上取决于游戏以及您希望如何处理游戏事件。假设我们正在编写简单的 2D 游戏,上面有飞船,那么状态可以是 java 中的一个简单类,例如:

    class ShipState{ 
          public float x; 
          public float y; 
          public float angle;
    }
    

    游戏中的网络代码负责传输这些结构。游戏通常在 TCP/IP 和 UDP 之上构建自己的协议来处理所有事情,因为在真实游戏中,有很多不同类型的信息双向传输,而不仅仅是物理状态。如果您认真对待您的项目,那么您应该真正研究网络库。我强烈怀疑有什么真正好的东西,因为 JAVA 在这个前沿不是很流行。单个 google 请求提出了这个 Kryo 库,看起来不错。您还可以查看netty,这是一个非常可靠的通用网络库。如果我要用 Java 编写游戏网络代码,我会去挖掘用 C/C++ 编写的开源游戏网络库,例如 Enet 以获得一些想法。

    深入了解您的问题,关于服务器上的球模拟,就像服务器发送球坐标和客户端接收这些坐标一样简单。如果您不确定它是如何完成的,您可能想查看these tutorials。和其他通用 Java 网络教程。祝你好运!

    【讨论】:

    • 我想指出的是,作为物理模拟,您还可以提供double speed; double xVector; double yVector; 来表示它的当前速度(速度和方向)。这将减少所需的状态更新次数服务器。 x 和 y 可以根据速度进行更新,因此您只需要在速度发生变化时进行更新。
    • m0s 写道:“游戏中的网络代码负责传输这些结构”,不,这不是我的问题,...我知道游戏中的网络代码要小心,但问题是如何,如果有人不这样做'不想使用某些库 =)
    • @Static Void Main - 教程最后一个链接中部分的答案。也你如何有点模棱两可。您可能会问“如何通过 TCP/IP 发送数据?”或“如何用 Java 构建基本的客户端/服务器程序?”或“如何设计低延迟的游戏网络协议?”我并不是要无聊,我只是真的不明白你到底在坚持哪一部分。要在评论中回答您的问题,如果您不想使用某些库,则必须编写自己的库:D 这不是一项非常简单的任务。
    • 我希望这篇文章能帮助你了解我的意图:coderanch.com/t/531394/Streams/java/…
    • @Static Void Main 是的,为此使用字符串不是一个好主意。根据我从您对 coderanch.com 的解释了解到,您的引擎正在运行,并且您已经建立了基本的网络连接。现在您可以通过流发送对象,查看这个问题:stackoverflow.com/questions/1453028/… 答案正是您通过网络发送状态对象所需要的。您的客户端需要在模拟的主循环中分派数据包并更新对象的状态,然后在需要时进行渲染。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2016-02-16
    相关资源
    最近更新 更多