我正在創建一個實時服務器客戶端應用程序,服務器發送一些繪畫命令並且客戶端繪製它們。我在我的Mac中開發了整個應用程序。一切工作都沒有錯誤,所以我決定在Windows機器上測試它。滯後於實時服務器/客戶端應用程序
經過大量的調試和測試,我已經隔離了這個問題。服務器發送每15毫秒的秩序。行爲在每個環境急劇變化
的Mac
客戶端接收與不同的響應時間(結果=實時應用)
System.currentTimeMillis()
Calling repaint: 1428155128955//Reception Time different
Calling repaint: 1428155129162
Calling repaint: 1428155129178
的順序Windows
客戶端在同一個(結果=滯後應用程序)接收多個訂單。多達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
我也進行了直播的VisualVM的Windows中的視頻: 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)
沒有任何改善
嗅探流量。這會給你包裹抵達的時間。這也可能是一個緩衝問題...... – Hannes 2015-04-04 14:52:12
溝通方式是什麼? TCP? – wilx 2015-04-04 15:10:35
嗨,謝謝你的回答,我已經更新了我的問題。目標是發送形狀(=字符串),它是一個基本的TCP連接 – 2015-04-04 15:47:25