【问题标题】:Real-time java game: Socket or RMI实时java游戏:Socket或RMI
【发布时间】:2013-10-25 19:31:29
【问题描述】:

我正在开发一款游戏,我想我会添加一个多人游戏选项。这是一个实时游戏,比如贪吃蛇之类的,所以我更新精灵位置非常快:

while (isRunning) {
   ...
   if (sprite instanceof PlayerSprite) {
            PlayerSprite player = ((PlayerSprite) sprite);
            collisionManager.checkCollision(player, map, elapsedTime, currTime);
            updatePosition(player, elapsedTime);
            player.animeUpdate(elapsedTime);
   }
   ...
}

我首先尝试使用 RMI:我将每个位置存储在一个对象中,并将其设置为远程。所以服务器和客户端都可以更新它。但正如我所说,它需要实时更新。 RMI 看起来并不能解决这个问题。但我真的是初学者,所以我不确定。

所以我的问题是:RMI 或简单 IO(套接字)将是实时游戏的最佳解决方案吗?

如果套接字更好:我可以通过 ObjectOutput/ObjectInput 将位置存储对象发送到客户端,更新对象(并绘制到屏幕上),然后将更新的对象发送回服务器,等等?

提前致谢:)

【问题讨论】:

    标签: java sockets rmi game-engine


    【解决方案1】:

    所以我的问题是:RMI 或简单 IO(套接字)将是最好的 实时游戏的解决方案?

    这个问题很容易回答。在两者之间,套接字是要走的路。 RMI 包含大量开销,这会减慢传输时间。实时的目标是尽可能缩短发送和接收信息之间的时间。

    如果套接字更好:我可以通过以下方式发送位置存储对象吗? ObjectOutput/ObjectInput 到客户端,更新对象(并绘制到 屏幕),然后将更新的对象发送回服务器,并且 等等?

    你可以,但如前所述,它很慢。您将需要使用具有客户端-服务器消息传递系统的库(我使用Kryonet)或编写自己的协议。看起来很明显的关键是客户端和服务器之间可以轻松地相互理解。

    【讨论】:

    • 谢谢,看起来不错。我将首先尝试使用简单的套接字,我对它有点熟悉。然后我会给 Kryonet 一个机会 :)
    【解决方案2】:

    我不建议使用 Socket 或 RMI!

    在我看来,您应该使用 REST 服务来处理多人游戏。

    【讨论】:

    • 从未听说过。能发个教程吗?在我看来它是一个网络服务,还是不是?
    【解决方案3】:

    如果您追求速度,那么不要将 Java 序列化用作 it is much slower than JSON serialization

    JSON is fine,我个人会尝试使用 Google Protocol Buffers 的Akka Remote Actors,尽管这需要学习。

    【讨论】:

    • 更正:Akka 使用 ProtoBuf 作为远程协议,但是用户级消息可以使用任何你想要的序列化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多