【问题标题】:Performance : ArrayList or ConcurrentHashMap性能:ArrayList 或 ConcurrentHashMap
【发布时间】:2013-10-23 19:17:54
【问题描述】:

我正在制作一个游戏,我必须将一些精灵数据(例如位置、图像等)存储在一个集合中。问题是我应该使用哪个集合?

我,我的主要问题是碰撞检测:

1,我第一次使用简单的 ArrayList,但是当我必须检查实际精灵是否与其他精灵发生碰撞时,我必须遍历所有其他精灵以找出它。我觉得这有点太费劲了。

2,第二次我认为 ConcurrentHashMap 可能是理想的。因此,当我尝试将精灵移动到其他位置时,我可以检测它是否是保留位置。

II,然后是另一个问题:

1,当我更新 ArrayList 时,我可以遍历所有精灵并覆盖旧位置。

2,但是当我更新 ConcurrentHashMap 时,我必须从地图中删除实际条目并放置一个新条目而不是它(我不能只更改键,因为值不会跟随它)。所以这里我们遇到了 remove 和 put 的性能问题。

提前致谢。

【问题讨论】:

  • 您可能想要创建一个特殊的集合,以便随着时间的推移对背景中的元素进行排序。按它们的 x 值或其他东西对它们进行排序。然后,当您检查碰撞时,您只能检查列表的一个子集。只是一个想法:)
  • @Cruncher 可能是某种树?当它变成 2D 时会变得更难,但某种树或带有节点的连接图可以看到他们的邻居可以减少搜索时间......或者如果图实施不当,则使其无限。
  • @AlexBeisley 这当然是一个棘手的实现。但是,如果您需要在某个地方偷工减料,肯定会有所帮助。我也担心,在后台排序不会给你带来太多的性能帮助,如果这意味着上下文切换你的渲染过程。
  • @Cruncher 无论如何,您可能应该将渲染与处理这些东西分开,将所有可绘制对象的列表作为引用提供给每次迭代的渲染器。不过,碰撞总是很痛苦。

标签: java performance arraylist game-engine concurrenthashmap


【解决方案1】:

在我看来,将您的碰撞基于集合类型似乎很不寻常,除非该集合是一个 2D/3D 网格,每个位置有一个对象,表示为一个数组。如果是,您可以在 O(1) 中检查该数组上的精确点。

如果您正在精确地进行碰撞,以像素或矢量为单位,您可能必须进行迭代。

在这种情况下,我会使用某种 LinkedList,因为您可能会在发生碰撞时删除内容。

【讨论】:

  • +1 用于建议 LinkedList,如果主要关注点是迭代(并且可能在迭代期间删除)。
  • 谢谢,我正在检查以像素为单位的碰撞,所以我会重复很多次。
  • 啊,在这种情况下,你会想看看我的 cmets 来回答你的问题,@Aksirba。您绝对可以制作某种虚拟网格来限制您必须迭代的对象。你给你的对象一个单元格,它会在移动时根据对象的原点进行更新。如果对象是固定大小,您可以知道要在其中获取对象的网格元素数。但是,如果您的商品少于 50 件,则很可能只需列出一份清单即可。
  • @Aksirba:请注意,您要么不需要ConcurrentHashMap,要么不能使用LinkedList。您是否需要并发访问。
猜你喜欢
  • 1970-01-01
  • 2010-11-25
  • 1970-01-01
  • 2011-08-20
  • 2011-10-05
  • 2012-04-29
  • 2019-01-24
  • 1970-01-01
  • 2016-03-16
相关资源
最近更新 更多