java - 性能问题一旦有多个客户端连接到服务器
问题描述
我目前正在开发一款多人 Java 游戏。为了允许多个客户端同时播放,我创建了一个DatagramSocket
服务器。
我的服务器的“协议”是这样工作的:
- 客户端向服务器发送更新。
- 服务器接收更新。
- 服务器创建一个新线程来处理更新。
- 新线程将包含需要呈现的内容的数据包发送回客户端。
第四步是通过以下方法实现的:
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)
方法效果很好,但一旦另一个客户端连接,客户端就会遇到许多性能问题,我不知道为什么。我相信问题与服务器无关,因为它仍然能够与客户端通信。
当多个客户端连接到服务器时,为什么会出现性能问题的一些可能原因是什么?
解决方案
推荐阅读
- sas - SAS 字符比较
- windows - 如何使用 CMD 和 reg.exe 添加具有包含空格和参数的长路径的程序可执行文件?
- firebase - 如何在日期为 datenow 的 firebase 选择条件中查询
- c# - 在使用 MVVM 单击 ListView 项目内的按钮时选择 ListView 中的项目
- scrapy - 如何使用 Scrapyd 和 ScrapydWeb 在集群中分布蜘蛛?
- ios - 在 IOS 13 中,当 ViewController 未推送时,Google Map 相机位置未显示准确。附上两个屏幕截图
- assembly - 在 GAS .intel-syntax 程序集中的内存标签和寄存器上使用“偏移”和“[]”有什么区别?
- firebase - 为什么 Firebase 身份验证在没有 google dns 的情况下不起作用?
- python - python中所有可能的组合
- go - Golang 将 gob 字符串转换为接口