有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

一旦有多个客户端连接到服务器,java性能就会出现问题

我目前正在开发一款多人java游戏。为了允许多个客户端同时播放,我创建了一个DatagramSocket服务器

我的服务器的“协议”是这样工作的:

  1. 客户端向服务器发送更新
  2. 服务器接收更新
  3. 服务器创建一个新线程来处理更新
  4. 新线程将一个包发送回客户端,其中包含需要呈现的内容

第四步通过以下方法实现:

public void sendBack(InetSocketAddress address, ArrayList<RenderEntity> renderEntities) {
    Player p = this.clients.get(address);
    RenderPacket packet = new RenderPacket(renderEntities, p.getX(), p.getY());
    this.byteBuffer = packet.getBytes();
    DatagramPacket sendPacket = new DatagramPacket(this.byteBuffer, this.byteBuffer.length, address.getAddress(), address.getPort());
    try {
        this.socket.send(sendPacket);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

从我在自己的机器上测试的结果来看,这个“协议”运行得相对较好,但从我在网上看到的情况来看,我的“协议”的第四步是非常规的。一旦收到更新,包含需要呈现内容的数据包将被发送到连接到服务器的所有客户端,只发送更新的客户端

为了尝试并实现这一改变,我尝试使用以下方法:

public void sendToAll(ArrayList<RenderEntity> renderEntities) {
    try {
        for (InetSocketAddress address : this.clients.keySet()) {
            Player p = this.clients.get(address);
            RenderPacket packet = new RenderPacket(renderEntities, p.getX(), p.getY());
            byte[] data = packet.getBytes();
            DatagramPacket sendPacket = new DatagramPacket(data, data.length, address.getAddress(), address.getPort());
            this.socket.send(sendPacket);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

当只有一个客户端连接时,sendToAll(renderEntities)方法非常有效,但一旦另一个客户端连接,客户端就会遇到许多性能问题,我不知道为什么。我认为问题与服务器无关,因为它仍然能够与客户端通信

当多个客户端连接到服务器时,为什么会出现性能问题,有哪些可能的原因


共 (0) 个答案