【问题标题】:Dynamically group clients by location, limited to a maximum size按位置动态分组客户端,限制为最大大小
【发布时间】:2016-11-22 23:15:12
【问题描述】:

因此,我正在开展一个项目,该项目需要对一组客户端进行迭代以进行更新,每个客户端都需要为附近的每个其他客户端提供更新数据包。我希望能够以快速的方式执行此操作,因为大量客户端会以经常发生的间隔进行更新。

我最初的攻击计划是根据客户端位置创建区域,仅使用其区域中的其他客户端更新每个客户端。这将需要一个LinkedList<Region>,该区域有自己的客户端列表,这些客户端将相互更新。这种方法的一个问题是,一些地区可能有 1 个客户端,而另一些地区可能有 1000 个客户端。另一个难度来自客户端将不断移动(从而改变位置和地区)这一事实。如果有一种方法可以在迭代列表时修改列表,则可以避免这些问题,当区域变得太大时可能会拆分元素。

接下来我想创建一个大型List<Client> 来容纳所有玩家,并根据位置不断地对其进行排序。然后用最近的 20 个客户端更新列表中索引 n 的客户端,我只会从他们当前的索引中迭代 n-10 和 n+10。我不太喜欢这种方法,因为如果在附近区域有第 21 个客户,即使他们与n 的客户的距离与n+10 的客户距离相等,也可以忽略它们。每次滴答都要诉诸所有客户似乎也很慢。

在速度方面,这些方法中哪一种提供了更好的性能?此外,还有其他我应该考虑的 Java 集合吗?谢谢!

【问题讨论】:

    标签: java performance list collections big-o


    【解决方案1】:

    我非常喜欢第一种方法。每次对整个列表进行排序在时间上都是一个非常糟糕的主意,这排除了第二种方法。

    要解决并发问题,您应该在线程中更新之前复制LinkedList<Reigon>。这样一来,您将允许Clients 更改他们的Reigon,同时将更新推送到每个Reigon。

    另一个注意事项是,如果您打算从 LinkedList<Reigon> 检索任意 Reigon(例如,当您将 Client 从一个 Reigon 移动到另一个时)您应该查看某种哈希放。从列表中间检索任意元素时,它将大大提高性能,尤其是在列表很大的情况下。

    【讨论】:

      猜你喜欢
      • 2012-07-15
      • 2011-04-25
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 2020-12-22
      相关资源
      最近更新 更多