【发布时间】: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