因此,我正在开发一个项目,该项目需要迭代一组客户端进行更新,每个客户端都需要为邻近的其他客户端提供更新数据包。我希望能够以一种快速的方式做到这一点,因为大量客户端会经常发生更新。
我最初的攻击计划是根据客户位置创建区域,仅与其所在区域的其他客户更新每个客户端。这需要LinkedList<Region>
,区域有自己的客户列表,它们之间会相互更新。这种方法的一个问题是一些区域可能有1个客户端,而其他区域可能有1000个。另一个难度是由于客户端将不断移动(因此改变位置和区域)。如果有一种方法可以在迭代时修改列表,可能会避免这些问题,可能会在区域变得过大时拆分元素。
接下来,我想到创建一个拥有所有玩家的大型List<Client>
,这些玩家会根据位置不断进行排序。然后,为了更新列表的索引n
的客户端与最近的20个客户端,我只会从当前索引迭代n-10
和n+10
。我不太喜欢这种方法,因为如果在近距离区域有第21个客户端,即使它们与n
处的客户端距离n+10
的距离相同,也可以忽略它们。 }}。在每个滴答声中都必须诉诸所有客户似乎很慢。
就速度而言,哪种方法提供了更好的性能?另外,我还应该考虑其他任何Java集合吗?谢谢!
答案 0 :(得分:1)
我非常喜欢第一种方法。对每个刻度排序整个列表最终会在时间上成为一个非常糟糕的想法,这排除了第二种方法。
要解决并发问题,您应该在更新线程之前复制LinkedList<Reigon>
。这样,您就可以Client
在更新被推送到每个Reigon
的同时更改Reigon
。
另一个注意事项是,如果您计划从Reigon
检索任意LinkedList<Reigon>
(例如,当您将Client
从Reigon
移动到另一个foo_cached = mem.cache(foo)
时应该研究某种哈希集。从列表中间检索任意元素时,它会大大提高性能,特别是如果列表很大。