簡體   English   中英

UDP網路延遲3秒

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM