Java 顺序很少变化的快速排序

Java 顺序很少变化的快速排序,java,performance,sorting,Java,Performance,Sorting,我正在做一个带有滚动视图的2D游戏(想想红色警报或塞尔达),但我在画图时步履蹒跚 基本上有两种类型的对象绘制在地图上。有些人有固定的位置(如树木和建筑物),有些人则四处走动(玩家、敌人、飞箭) 为了使事物以正确的方式出现在彼此面前,它们需要按照特定的顺序绘制(首先是远处的对象,然后朝向“摄影机”) 现在,每当游戏更新时(每秒100次),我都会对所有对象(两种)的列表进行排序,这感觉像是在浪费CPU时间。对象的顺序很少改变,当它们改变时,它们通常只在列表中向上或向下移动一个位置 另一个问题是,只需

我正在做一个带有滚动视图的2D游戏(想想红色警报或塞尔达),但我在画图时步履蹒跚

基本上有两种类型的对象绘制在地图上。有些人有固定的位置(如树木和建筑物),有些人则四处走动(玩家、敌人、飞箭)

为了使事物以正确的方式出现在彼此面前,它们需要按照特定的顺序绘制(首先是远处的对象,然后朝向“摄影机”)

现在,每当游戏更新时(每秒100次),我都会对所有对象(两种)的列表进行排序,这感觉像是在浪费CPU时间。对象的顺序很少改变,当它们改变时,它们通常只在列表中向上或向下移动一个位置

另一个问题是,只需要考虑屏幕上的实际对象。由于地图可能会变得相当大,包含1000个对象,我不想每秒对它们进行100次排序

您建议我如何解决这个问题?

的最佳情况是当元素已经排序时。在这种情况下,您将得到O(n)比较。根据维基百科:

在计算机图形学中,它很流行,因为它能够在几乎排序的数组中检测一个非常小的错误(如仅交换两个元素),并以线性复杂度(2n)修复它

但由于链接文章中提到的各种原因,它被认为是一个“糟糕”的算法。您可能需要分析它和插入排序(对于排序列表也是O(n))之间的差异,以查看实际中哪个更快


另一种选择是使用一种数据结构,该结构将已排序的项目保存在其中,并在项目位置发生变化时收到通知。如果与重新绘制对象的频率相比,对象不会移动太多,这将节省大量处理时间,因为您只需重新排序位置已更改的元素,在至少一个元素移动之前,可以避免重新排序。

跟踪向量中屏幕上的对象,并在向量末尾添加新的可见对象。使用气泡排序或插入排序进行排序。这对于随机数据来说效率越来越低,但是对于几乎已排序的数据来说~O(n)。

同意冒泡排序和插入排序


我还有其他没有排序的想法:如果很少更改顺序,您只能跟踪更改历史并在需要排序时恢复顺序。此外,如果不添加或删除元素,只需恢复原始有序列表的快照,将非常容易和快速。如果我清楚地理解了您的问题。

请考虑使用PriorityQueue,或者可能使用双链接列表,以便您可以在需要时直接重新定位其中的项目,而不是根据Z顺序强制执行。您还应该彻底调查剪辑区域。

对100个对象进行排序不会花费很长时间。但是,如果性能真的很重要,并且您知道列表可能几乎被排序,几乎没有项目不按顺序排列,那么merge-sort或Tim-sort算法可能会给您带来良好的性能。对于已经排序的列表,或者只有几个元素没有顺序的列表,它的性能为O(N)

也就是说,在测量Java库提供的通用排序算法的实际性能之前,不要忽略它。由于它是通用的,它的实施方式应能为广泛的情况提供合理的性能,包括清单几乎已经排序的情况

事实上,标准的Java排序方法在Java 6中使用了合并排序,在Java 7中改为TimSort。

or似乎是很好的算法。大多数移动的对象都会以N的速度移动,所以数据结构可能会减慢速度