【问题标题】:Java - Socket.writeObject() is really slowJava - Socket.writeObject() 真的很慢
【发布时间】:2012-04-11 10:54:27
【问题描述】:

您好,我想告诉您,我为我的游戏制作了多人游戏并且它可以运行,但是从欧洲的一侧到另一侧,需要 8 秒。发送的内容不多,只发送一个有float x、float y和String username的对象。

在服务器中,我有 3 个线程:接受、发送、接收。并且客户端有发送和接收。

部分服务器发送:

oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream()));
int client_state = list_client_states.get(i);
oos.writeObject(client_state);
oos.flush();

oos = new ObjectOutputStream(new BufferedOutputStream(list_sockets.get(i).getOutputStream()));
oos.writeObject(list_data);
oos.flush();

客户端类似,这里是服务器的接收(播放器也类似):

ois = new ObjectInputStream(list_sockets.get(i).getInputStream());
int receive_state = (Integer)ois.readObject();

ois = new ObjectInputStream(list_sockets.get(i).getInputStream());
DataPackage dp = (DataPackage) ois.readObject();

list_data.set(i,dp);

【问题讨论】:

  • 很久了。你做过网络诊断吗?从服务器到这个遥远的客户端的 ping 时间是多少。您可能希望使用更紧凑的通信格式,例如 protobufKyro
  • 好的,我会看到,我没有做任何 ping 操作,现在我会看到 protobuf 和 Kyro

标签: java performance sockets multiplayer


【解决方案1】:

对于发送一个仅由 2 个浮点数和一个字符串组成的对象,您如何进行序列化/反序列化不会有太大的不同。当然它不会直接导致 8 秒的延迟。 (序列化格式的影响可能只有几毫秒或更短,除非您使用的是比特率非常低的网络链接。)

我怀疑真正的问题要么是网络问题,要么是(可能)您没有向我们展示的代码中的某种同步错误。

【讨论】:

  • 嗯,同步。实际上我从来没有想过它,所以我不知道我该怎么做。我只是在一个线程(我认为它被称为守护线程)中有一个 while(true) 循环,它循环通过所有 CONNECTED 播放器(因此它不会发送给未连接的播放器),类似的东西会发送到客户端。
  • PS:我不知道我是如何进行序列化的(我还是多人游戏的新手),但我在我发送的对象类中实现了它,现在我已经在线阅读了 writeObject 自动序列化它。我猜,而且我不知道我的 flush() 是否在一个好地方。
【解决方案2】:

您可以使用时间戳来调试代码花费过多时间的确切位置。

long time=new Date().getTime();

System.out.prrintln("Tme stamp"+ (time/1000));

这样,您可以调试耗时的序列化或建立连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-11
    • 2013-04-12
    • 2018-09-19
    • 2012-02-03
    • 2017-11-10
    • 2010-12-28
    • 2013-01-25
    相关资源
    最近更新 更多