В настоящее время я работаю над многопользовательской Java-игрой. Чтобы позволить нескольким клиентам играть одновременно, я создал сервер DatagramSocket
.
«Протокол» для моего сервера работает примерно так:
- Клиент отправляет обновление на сервер.
- Сервер получает обновление.
- Сервер создает новый поток для обработки обновления.
- Новый поток отправляет обратно клиенту пакет, содержащий то, что должно быть обработано.
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)
отлично работает, когда подключается только один клиент, но как только другой клиент подключается, клиент испытывает множество проблем с производительностью, и я не знаю, почему. Я считаю, что проблема не связана с сервером, потому что он все еще может общаться с клиентами.
Каковы возможные причины возникновения проблем с производительностью, когда к серверу подключено более одного клиента?