[英]UDP networking 3 sec delay
因此,我今天開始研究多人游戲,但遇到了嚴重的問題,導致網絡延遲。 當我使用本地主機在一台計算機上測試東西時,沒有明顯的延遲。 但是,當我嘗試在筆記本電腦和PC上的服務器上運行客戶端時,大約會延遲2-3秒。
我基本上在做什么是:
服務器:
正在運行兩個線程,一個線程在偵聽端口上的數據包,而在收到帶有輸入的數據包時,他會相應地更新游戲狀態。 第二個線程從第一個線程獲取游戲狀態,然后每10毫秒將其發送給客戶端。
客戶:
還有兩個線程,一個線程接收游戲狀態,第二個線程每10ms發送一次帶有鍵盤輸入的數據包。
使用來自串行化類的字節數組對數據報分組進行封裝(兩個字節的大小均約為100個字節)
發送代碼:
ServerPacket testPacket = new ServerPacket(player.getX(),player.getY());
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutput out = null;
try
{
out = new ObjectOutputStream(bos);
out.writeObject(testPacket);
byte[] Bytes = bos.toByteArray();
DatagramPacket packet = new DatagramPacket(Bytes,Bytes.length,ip,port);
socket.send(packet);
//System.out.println("SERVER:SentUpdate");
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
finally
{
try
{
if (out != null)
{
out.close();
}
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
try
{
bos.close();
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
}
接收代碼:
byte[] data = new byte[packetLength];
DatagramPacket packet = new DatagramPacket(data, data.length);
try
{
socket.receive(packet);
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
ByteArrayInputStream bis = new ByteArrayInputStream(packet.getData());
ObjectInput in = null;
try
{
in = new ObjectInputStream(bis);
ServerPacket res = (ServerPacket)in.readObject();
return res;
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
catch (ClassNotFoundException ex)
{
System.out.println(ex.getMessage());
}
finally
{
try
{
bis.close();
} catch (IOException ex)
{
System.out.println(ex.getMessage());
}
try
{
if (in != null)
{
in.close();
}
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
}
任何想法為何如此緩慢? 或關於udp網絡我應該知道的任何事情。
您如何用兩個線程(10毫秒)實現如此高的頻率? 您確定它們以如此高的頻率運行嗎? 為什么要使用不同的線程進行接收和發送-與在同一線程上接收后發送相比,將花費更長的時間。 當然,您必須適應Internet上的某些延遲,游戲通常必須容忍每個對等方之間的200ms-在客戶端服務器中可能長達400ms。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.