首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UDP网络3秒延迟

UDP网络3秒延迟
EN

Stack Overflow用户
提问于 2014-04-06 21:09:48
回答 1查看 310关注 0票数 0

所以,我今天开始玩我的多人游戏,我遇到了一个严重的网络延迟问题。当我在一台机器上使用localhost进行测试时,没有明显的延迟。但是当我尝试在我的笔记本电脑上运行客户端和在PC上运行服务器时,我遇到了大约2-3秒的延迟。

基本上,我所做的是:

服务器:

正在运行两个线程,一个线程侦听端口上的数据包,当接收到带有输入的数据包时,他会相应地更新游戏状态。第二个线程从第一个线程获取游戏状态,并每隔10ms将其发送给客户端。

客户端:

还有两个线程,一个接收游戏状态,第二个线程每10ms发送一次带有键盘输入的数据包。

Im seding datagrampackets with bytearray,它来自序列化的类(两者的大小约为100字节)

发送代码:

代码语言:javascript
复制
    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());
        }
    }

接收代码:

代码语言:javascript
复制
        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网络的东西。

EN

回答 1

Stack Overflow用户

发布于 2014-04-07 15:55:10

你是如何用你的两个线程(10ms)达到如此高的频率的?你确定它们运行的频率如此之高吗?为什么要使用不同的线程来接收和发送--这会比在同一线程上接收之后发送的时间更长。当然,您必须适应Internet上的一些延迟,游戏通常必须容忍每个对等客户端服务器之间的高达200ms,这可能高达400ms。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22894482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档