gpt4 book ai didi

java - 每秒多次发送多个对象的套接字

转载 作者:行者123 更新时间:2023-12-01 10:21:11 25 4
gpt4 key购买 nike

所以我开始制作一款游戏,我想使用套接字进行多人游戏。这是一个简单的 2D 游戏,我希望发送的所有对象都扩展了一个名为 Entity 的类。我希望以 30Hz 的速度以最小的延迟或“ping”发送对象的位置。目前,我将对象作为 ArrayList 发送,我确信这不是解决此问题的最佳方法,也许我错了。此外,代码需要允许某人加入并发送他们的玩家数据(例如他们的名字),而不会干扰需要位置而不是信息的 ObjectInputStream。这是我到目前为止所尝试过的(请注意,这些方法是每秒定期调用 30 次)

客户:

public void Update {
...
outStream = new ObjectOutputStream(socket.getOutputStream());
outStream.writeObject(w.getAllLocalEntities());
//send objects created by this client (e.g bullets) and this client
inStream = new ObjectInputStream(socket.getInputStream());
w.setEntities((ArrayList<Entity>) inStream.readObject());
//recieve all objects the server has recieved from all clients
}

一些对象也是在服务器端创建的,例如僵尸等。服务器:

public void Update {
...
inStream = new ObjectInputStream(socket.getInputStream());
server.addEntities((ArrayList<Entity>) inStream.readObject());
//recieve client objects
outStream = new ObjectOutputStream(socket.getOutputStream());
outStream.writeObject(server.getEntities());
//send all objects
}

这似乎非常低效,所以我想知道是否有人知道更好的方法来解决这个问题。我的主要目标是最小化延迟/ping,记住可能有很多对象(最多 500 个)。所以问题是...你能改进我的方法吗?如有任何帮助,我们将不胜感激。

最佳答案

不是以 30Hz 发送数据,而是仅在数据发生变化时发送数据。

否则,您将面临发送许多未修改信息的风险,并且在发送新的修改数据之前需要等待(至少几毫秒)。

尝试使用 event driven paradigm :当新事件发生时,将事件发送给所有监听器。

<小时/>

此外,不要发送整个对象,也不要使用标准对象序列化。如果一个对象由固定部分和可变部分组成(例如名称和类型可以固定,位置和功率可以改变),则第一次发送整个数据,之后仅发送可变部分。节省了大量的网络流量和CPU消耗。

关于java - 每秒多次发送多个对象的套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35607987/

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