Java 优化拓扑排序

Java 优化拓扑排序,java,algorithm,sorting,libgdx,topological-sort,Java,Algorithm,Sorting,Libgdx,Topological Sort,所以我现在正在做一个等距平铺游戏,我使用拓扑排序来排序将要渲染的平铺的顺序。拓扑排序实际上决定了每个图块的深度,而要渲染的图块的arraylist是通过比较这些深度的比较器进行排序的 我遇到的问题基本上是拓扑排序的性能差。我不确定我是否遗漏了任何可能导致性能问题的内容。我将非常感谢任何可以用来优化拓扑排序的输入 我将一些变量存储在字段中,我不确定这是否会提高性能。我还使用公共字段进行必要的比较 相关代码片段: private void topological(Array<IsoSprite

所以我现在正在做一个等距平铺游戏,我使用拓扑排序来排序将要渲染的平铺的顺序。拓扑排序实际上决定了每个图块的深度,而要渲染的图块的arraylist是通过比较这些深度的比较器进行排序的

我遇到的问题基本上是拓扑排序的性能差。我不确定我是否遗漏了任何可能导致性能问题的内容。我将非常感谢任何可以用来优化拓扑排序的输入

我将一些变量存储在字段中,我不确定这是否会提高性能。我还使用公共字段进行必要的比较

相关代码片段:

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树库,看看它是否会变得更快。