Java 优化拓扑排序
所以我现在正在做一个等距平铺游戏,我使用拓扑排序来排序将要渲染的平铺的顺序。拓扑排序实际上决定了每个图块的深度,而要渲染的图块的arraylist是通过比较这些深度的比较器进行排序的 我遇到的问题基本上是拓扑排序的性能差。我不确定我是否遗漏了任何可能导致性能问题的内容。我将非常感谢任何可以用来优化拓扑排序的输入 我将一些变量存储在字段中,我不确定这是否会提高性能。我还使用公共字段进行必要的比较 相关代码片段:Java 优化拓扑排序,java,algorithm,sorting,libgdx,topological-sort,Java,Algorithm,Sorting,Libgdx,Topological Sort,所以我现在正在做一个等距平铺游戏,我使用拓扑排序来排序将要渲染的平铺的顺序。拓扑排序实际上决定了每个图块的深度,而要渲染的图块的arraylist是通过比较这些深度的比较器进行排序的 我遇到的问题基本上是拓扑排序的性能差。我不确定我是否遗漏了任何可能导致性能问题的内容。我将非常感谢任何可以用来优化拓扑排序的输入 我将一些变量存储在字段中,我不确定这是否会提高性能。我还使用公共字段进行必要的比较 相关代码片段: private void topological(Array<IsoSprite
private void topological(Array<IsoSprite> sprites) {
for (int i = 0; i < sprites.size; ++i) {
a = sprites.get(i);
behindIndex = 0;
for(IsoSprite sprite: sprites){
if(sprite != a){
if (sprite.maxX > a.minX && sprite.maxY > a.minY && sprite.minZ < a.maxZ) {
if (a.behind.size <= behindIndex) {
a.behind.add(sprite);
behindIndex++;
} else {
a.behind.set(behindIndex++, sprite);
}
}
}
}
a.visited = false;
}
sortDepth = 0;
for (IsoSprite sprite : sprites) {
visitNode(sprite);
}
}
private void visitNode(IsoSprite sprite) {
if (!sprite.visited) {
sprite.visited = true;
Iterator<IsoSprite> it = sprite.behind.iterator();
while (it.hasNext()) {
visitNode(it.next());
it.remove();
}
sprite.isoDepth = sortDepth++;
}
}
private void拓扑(数组精灵){
对于(int i=0;ia.minX&&sprite.maxY>a.minY&&sprite.minZ 如果(a.behind.size)您所说的性能差是什么意思?占用的时间太长?占用的内存太多?无法生成正确的顺序?第一件困扰我的事情(尽管与问题无关)这就是为什么您首先使用for循环,然后只对使用索引。get
然后是第二个foreach循环。现在,为了帮助回答您的问题,您可以在sprite上使用数组。sort
并实现自定义比较器,基本上是来自内部循环的if。它将比这快得多,这可能比O(n^2)更糟糕因为你要插入元素,这增加了很多时间复杂性-数组插入是O(m)复杂性,其中m是当前长度(从n之前开始是指总长度)。@MarkoGrešak这段代码只插入到列表的末尾,对于ArrayList,它被氨化为O(1),所以它不应该影响复杂性(n^3)在visitNode
中:基本上,对于每个节点,对于后面的中的每个元素,您删除第一个元素,并且该删除是O(n),与添加到末尾不同。如果要清除后面的,请在循环后调用behind.clear(),或者,是的,使用LinkedList,或者从最后一个元素开始删除(反向迭代)。如果每次都要从后面删除所有元素,则部分if(a.behind.size O(n^2)在这里,因为对于每个精灵,我们希望找到它重叠的精灵(或者我们可以简单地尝试其他精灵(即,将其视为完整图形),但无论如何它都是O(n^2)使用空间索引可能会加快速度,请看这里:也许您可以在代码中快速插入一些R树库,看看它是否会变得更快。