实时服务器/客户端应用程序滞后

时间:2015-04-04 14:29:27

标签: java windows connection client-server lag

我正在创建一个实时服务器 - 客户端应用程序,服务器发送一些绘制订单,客户端绘制它们。我在Mac上开发了整个应用程序。一切都在实时无误地工作,所以我决定在我的Windows机器上测试它。

经过大量的调试和测试后,我已经解决了这个问题。服务器每15ms发送一次订单。每个环境中的行为都会发生显着变化

苹果

客户收到一个响应时间不同的订单(结果=实时应用程序)

System.currentTimeMillis()
Calling repaint: 1428155128955//Reception Time different
Calling repaint: 1428155129162
Calling repaint: 1428155129178

客户收到多个订单(结果=滞期申请)。最多同时收集5个订单

System.currentTimeMillis()
Calling repaint: 1428155129524//Reception time the same
Calling repaint: 1428155129524
Calling repaint: 1428155129524

我想强调在具有相同互联网连接的两个环境中相同的可运行jar ,我已经上传了两个视频来说明问题

MAC视频 - 实时https://youtu.be/OhNXdGXoQpk

Windows视频 - 滞后https://youtu.be/OhNXdGXoQpk

我还在Windows中进行了实时VisualVM视频:https://youtu.be/cRNX4b3rlZk。我没有看到任何奇怪的东西可以解释为什么滞后发生但我远非专家(抱歉质量低)。

另外我试过

  • 增加堆大小
  • 使用特殊垃圾收集器

    -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=2 -XX:+AggressiveOpts
    

可能会如此剧烈地影响性能?有可能的解决方案吗?

我不知道什么可能导致滞后。

提前谢谢

更新

按照@Hannes的建议后,我嗅探了服务器和客户端之间的所有流量,结果如下:

数据包在不同时间到达。但我不知道为什么数据包会累积(这是一个简单的TCP连接):

 clientSentence = inFromClient.readLine();
 System.out.println("Arrived: "+ System.currentTimeMillis());
 //paint

并同时阅读。

让我更麻烦的是它在我的Mac环境中运行的原因....

我还测试Socket.setTcpNoDelay(boolean)没有任何改进

1 个答案:

答案 0 :(得分:0)

尝试关闭延迟发送。尝试使用Socket.setTcpNoDelay(boolean)

相关问题