按位置对客户端进行动态分组,限制为最大大小

Dynamically group clients by location, limited to a maximum size

所以我正在从事一个项目,该项目需要迭代一组客户端以进行更新,每个客户端都需要附近的每个其他客户端的更新包。我希望能够快速完成此操作,因为更新将以经常发生的时间间隔对大量客户端进行。

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

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

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

我非常喜欢第一种方法。每次报价都对整个列表进行排序最终会成为一个非常糟糕的主意,这排除了第二种方法。

要解决并发问题,您应该先复制 LinkedList<Reigon>,然后再在线程中更新它。这样,您将允许 Client 更改他们的 Reigon,同时更新被推送到每个 Reigon

另一个注意事项是,如果您计划从 LinkedList<Reigon> 中检索任意 Reigon(例如,当您将 Client 从一个 Reigon 移动到另一个) 你应该研究某种哈希集。当从列表中间检索任意元素时,它会大大提高性能,尤其是当列表很大时。