所以,我今天开始在我的多人游戏中工作,我遇到了一个严重的问题,我的网络延迟。当我使用localhost在一台机器上测试时,没有明显的延迟。但是,当我尝试在我的笔记本电脑上运行客户端和PC上的服务器时,我遇到大约2-3秒的延迟。
基本上我正在做的是:
服务器:
正在运行两个线程,一个用于侦听端口上的数据包,当收到带有输入的数据包时,他会相应地更新游戏状态。第二个线程从第一个线程获取游戏状态,每隔10毫秒将其发送给客户端。
客户端:
还有两个线程,一个接收游戏状态,第二个每隔10ms发送一次带键盘输入的数据包。
我正在使用来自序列化类的bytearray发送datagrampackets(两者的大小约为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网络的任何事情。
答案 0 :(得分:0)
你用两个线程(10ms)如何实现如此高的频率?你确定他们的运行频率如此之高吗?为什么使用不同的线程进行接收和发送 - 这比在同一线程上接收后发送所需的时间更长。当然,你必须适应互联网游戏的一些延迟,通常必须容忍每个对等的客户端服务器之间最多200毫秒。