Проблемы с производительностью, если к серверу подключено более одного клиента - PullRequest
1 голос
/ 23 марта 2019

В настоящее время я работаю над многопользовательской Java-игрой. Чтобы позволить нескольким клиентам играть одновременно, я создал сервер DatagramSocket.

«Протокол» для моего сервера работает примерно так:

  1. Клиент отправляет обновление на сервер.
  2. Сервер получает обновление.
  3. Сервер создает новый поток для обработки обновления.
  4. Новый поток отправляет обратно клиенту пакет, содержащий то, что должно быть обработано.

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();
    }
}

Этот «протокол» работает относительно хорошо из того, что я тестировал на своей собственной машине, но из того, что я видел онлайн, 4-й шаг моего «протокола» нетрадиционен. Как только обновление получено, пакет, содержащий то, что должно быть отображено, отправляется всем клиентам, подключенным к серверу, в отличие от только клиенту, который отправил обновление .

Чтобы попытаться реализовать это изменение, я попытался использовать следующий метод:

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) отлично работает, когда подключается только один клиент, но как только другой клиент подключается, клиент испытывает множество проблем с производительностью, и я не знаю, почему. Я считаю, что проблема не связана с сервером, потому что он все еще может общаться с клиентами.

Каковы возможные причины возникновения проблем с производительностью, когда к серверу подключено более одного клиента?

...