2013-10-23 55 views
0

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

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

1,我用了一个简单的ArrayList的第一次,但是当我要检查实际的精灵是否与其他精灵碰撞我不得不遍历所有其他精灵找出它。我认为它有点过于努力。

2,第二次我想也许ConcurrentHashMap会是理想选择。所以当我尝试将精灵移动到其他地方时,我可以检测它是否是保留位置。当我更新的ArrayList我可以遍历所有的精灵和覆盖旧的位置

1:

II,然后是其他的问题。

2,但是当我更新ConcurrentHashMap时,我必须从地图中删除实际的条目,并放置一个新的而不是它(我不能只是改变键,导致该值不会跟着它) 。所以在这里我们得到了移除和放置的性能问题。

在此先感谢。

+0

您可能想要制作一个特殊集合,以便随着时间的推移对背景中的元素进行排序。根据它们的x值或其他值对它们进行排序。然后,当您检查碰撞时,您只能检查列表的一部分。只是一个想法虽然:) – Cruncher

+0

@Cruncher可能是某种树?当它变成二维时变得越来越难,但是如果图形实施得不好,某种树或连接图可以看到它们的邻居可以减少搜索时间或使其变得无限。 – Magus

+0

@AlexBeisley这当然是一个棘手的实现。但是,如果你需要在某个角落切角,肯定会有所帮助。我也担心,如果在后台切换渲染过程,背景中的排序不会给您提供太多的性能帮助。 – Cruncher

回答

1

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

如果您正在精确地进行碰撞,在像素或向量中,您可能必须进行迭代。

在这种情况下,我会使用某种LinkedList,因为您可能会删除碰撞事件。

+0

+1用于提示LinkedList,如果主焦点是迭代(并且可能在迭代期间移除)。 – Cruncher

+0

谢谢,我正在检查像素中的碰撞,所以我会迭代很多。 – Aksirba

+0

啊,在这种情况下,你会想看看我对你的问题的评论,@Aksirba。你一定可以做出某种虚拟网格来限制你必须迭代的对象。你给你的对象一个单元格,当它移动时它会根据对象的原点进行更新。如果对象是一个集合的大小,你可以知道有多少个网格元素来获取对象。但是,如果您的项目少于50件,则最有可能的情况是可以列出清单。 – Magus