gpt4 book ai didi

Java - 简单的网络游戏非常滞后

转载 作者:行者123 更新时间:2023-12-03 18:07:55 27 4
gpt4 key购买 nike

一天前我已经在 codereview 上问过这个问题了,但我还没有收到任何回复,所以我想试着在这里问一下。

让我告诉你我想做什么:

弹出一个窗口询问用户是否要运行服务器或客户端。选择服务器将在 LAN 上启动一个服务器。选择客户端将尝试连接到该服务器。服务器运行并且客户端连接后,会弹出一个带有两个方 block 的窗口。服务器/客户端都可以使用箭头键移动他们的方 block 。

这就是我得到的:

服务器的正方形以所需的速度移动,但他的移动在客户端一侧非常不稳定。另一方面,客户广场似乎以每秒大约 3 个像素的速度移动(太慢了)。

这就是我要问的:

我想我的问题很明显。我所做的只是通过互联网发送 2 个整数。现代在线游戏发送的数据比这多,而且它们几乎没有滞后,所以显然我做错了什么,但是什么?

服务器.java:

// server class
public class Server {
// networking objects
private ServerSocket serverSocket;
private Socket clientSocket;
private DataOutputStream clientOutputStream;
private DataInputStream clientInputStream;
// game objects
private Vec2D serverPos, clientPos;
private GameManager gameManager;
// run method
public void run() {
// intialization try-catch block
try {
// setup sockets
serverSocket = new ServerSocket(1111);
clientSocket = serverSocket.accept();
// setup I/O streams
clientOutputStream = new DataOutputStream(clientSocket.getOutputStream());
clientInputStream = new DataInputStream(clientSocket.getInputStream());
} catch(IOException e) { Util.err(e); }
// declare & intialize data exchange thread
Thread dataExchange = new Thread(
new Runnable() {
// run method
@Override
public void run() {
// I/O try-catch block
try {
// exchange-loop
while(true) {
// write x & y, flush
synchronized(gameManager) {
clientOutputStream.writeInt(serverPos.x);
clientOutputStream.writeInt(serverPos.y);
clientOutputStream.flush();
}
// read x & y
clientPos.x = clientInputStream.readInt();
clientPos.y = clientInputStream.readInt();
}
} catch(IOException e) { Util.err(e); }
}
}
);
// setup game data
serverPos = new Vec2D(10, 10);
clientPos = new Vec2D(300, 300);
gameManager = new GameManager(serverPos, clientPos, serverPos);
// start data exchange thread
dataExchange.start();
// start main loop
while(true) {
// get keyboard input
synchronized(gameManager) {
gameManager.update();
}
// repaint, sleep
gameManager.repaint();
Util.sleep(15);
}
}
}

客户端.java:

// client class
public class Client {
// networking objects
private Socket serverConnection;
private DataOutputStream serverOutputStream;
private DataInputStream serverInputStream;
// game objects
private Vec2D serverPos, clientPos;
private GameManager gameManager;
// run method
public void run() {
// intialization try-catch block
try {
// setup socket
serverConnection = new Socket(InetAddress.getByName("192.168.0.19"), 1111);
// setup I/O streams
serverOutputStream = new DataOutputStream(serverConnection.getOutputStream());
serverInputStream = new DataInputStream(serverConnection.getInputStream());
} catch(IOException e) { Util.err(e); }
// declare & intialize data exchange thread
Thread dataExchange = new Thread(
new Runnable() {
// run method
@Override
public void run() {
// I/O try-catch block
try {
// exchange-loop
while(true) {
// read x & y
synchronized(gameManager) {
serverPos.x = serverInputStream.readInt();
serverPos.y = serverInputStream.readInt();
}
// write x & y, flush
serverOutputStream.writeInt(clientPos.x);
serverOutputStream.writeInt(clientPos.y);
serverOutputStream.flush();
}
} catch(IOException e) { Util.err(e); }
}
}
);
// setup game data
serverPos = new Vec2D(10, 10);
clientPos = new Vec2D(300, 300);
gameManager = new GameManager(serverPos, clientPos, clientPos);
// start data exchange thread
dataExchange.start();
// start main loop
while(true) {
// get keyboard input
synchronized(gameManager) {
gameManager.update();
}
// repaint, sleep
gameManager.repaint();
Util.sleep(15);
}
}
}

我去掉了一堆代码 - 我希望现在不会造成混淆。感谢您的帮助!

最佳答案

您正在使用套接字,也许您发现它对于实时对话来说很慢,因为它们是基于 TCP 构建的,必须确认消息并保持 ping 以查看连接是否仍然存在。

也许您应该使用在 UDP 协议(protocol)上工作的 DatagramSocket。不同之处在于,UDP 只是吐出一些东西,而无需保持连接,甚至不需要尝试知道消息是否到达。

使用示例:http://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html

编辑:为什么不尝试仅在服务器中的位置发生变化时才发送该 int?可能服务器发送了太多的整数,以至于您的客户端有一个充满相同值的缓冲区,并且当您逐个读取 int 而不是清空缓冲区时,您会产生一种假装迟钝的感觉。

关于Java - 简单的网络游戏非常滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16147822/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com