【问题标题】:Sockets to send many objects multiple times a second每秒多次发送许多对象的套接字
【发布时间】:2016-02-25 01:05:28
【问题描述】:

所以我开始制作一款我想使用套接字的多人游戏。这是一个简单的 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 个)。所以问题是......你能改进我的方法吗?任何帮助表示赞赏。

【问题讨论】:

    标签: java sockets


    【解决方案1】:

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

    否则,您可能会发送许多未修改的信息,并且您会等待(至少几毫秒),然后再发送新的修改数据。

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


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

    【讨论】:

    • 此外,默认的 Java 序列化不如某些解决方案高效。您可能想查看KryoKryoNet
    • @JustACluelessNewbie 对。最有效的解决方案是使用自定义序列化来限制通过网络发送的字节数。我认为在这种情况下使用库没有必要。至少在性能方面没有。
    • 为什么要重新发明轮子?与实际游戏逻辑相比,将对象序列化为字节可能需要相当低级的编程。我建议从现有库(使用最好的 API)开始,仅在使用的解决方案证明效率太低时才使用自定义序列化。
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2013-07-07
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多