我正在创建一个实时服务器 - 客户端应用程序,服务器发送一些绘制订单,客户端绘制它们。我在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)
没有任何改进