1

我正在从瓦片集中整理一张地图。作为其中的一部分,我有一个方法,一旦重要部分被绘制出来,就会用随机地形相关的 BufferedImages 填充地图的其余部分。该fillIn方法采用两个参数 - BufferedImages 的数组列表和整数的 ArrayList。整数的形式为,例如 90,92,94,96,98,100 并表示百分比 - 两个 ArrayList 大小相同,该示例意味着第一个图块有 90% 的机会,即 2%第二个等等(实际上,您会在我的代码中注意到这也不是完美的工作。这不是问题,我知道如何解决它。只是还没有完成。)

地图是一千个方块,填充这张地图的速度慢得令人无法接受。有没有加快速度的提示或技巧?真的,我希望它快得不明显。

考虑到复杂性,SSCE 最终不会很短,但 fillIn 方法的代码如下,如果任何其他部分有用,请告诉我。

    private void fillIn (ArrayList<BufferedImage> b, ArrayList <Integer> r){
    for (int i=0; i<FULLGRIDSIZE; i++){
        for (int j=0; j<FULLGRIDSIZE; j++){
            if (mapArray[i][j] ==null){
                Random rand = new Random();
                int random = rand.nextInt(100);
                for (int loopVar =0 ;loopVar<r.size();loopVar++){
                    System.out.println(random +" "+ loopVar);
                    if (random < r.get(loopVar)){
                        mapArray[i][j] = b.get(loopVar);
                        break;
                    }
                }                   
            }
            }
        }
}
4

3 回答 3

2
private void fillIn (ArrayList<BufferedImage> b, ArrayList <Integer> r){
    Random rand = new Random();
    for (int i=0; i<FULLGRIDSIZE; i++){
        for (int j=0; j<FULLGRIDSIZE; j++){
            if (mapArray[i][j] ==null){
                // Random rand = new Random(); Don't create so many Randoms!
                int random = rand.nextInt(100);
                for (int loopVar =0 ;loopVar<r.size();loopVar++){
                    // System.out.println(random +" "+ loopVar);
                    // printlns take a surprisingly long time
                    if (random < r.get(loopVar)){
                        mapArray[i][j] = b.get(loopVar);
                        break;
                    }
                }                   
            }
        }
    }
}
  1. 您不需要新的Random每个循环。
  2. 不要System.out.println。它可以使你的代码变慢一个惊人的速度。
于 2013-06-17T12:46:28.757 回答
1

您应该有一个随机生成器对象,并且可以尝试只调用一次打印输出。

 Random rand = new Random();

private void fillIn (ArrayList<BufferedImage> b, ArrayList <Integer> r){
    String out = "";
    for (int i=0; i<FULLGRIDSIZE; i++){
        for (int j=0; j<FULLGRIDSIZE; j++){
            if (mapArray[i][j] ==null){
                int random = rand.nextInt(100);
                for (int loopVar =0 ;loopVar<r.size();loopVar++){
                    out += random +" "+ loopVar + "\n";
                    if (random < r.get(loopVar)){
                        mapArray[i][j] = b.get(loopVar);
                        break;
                    }
                }                   
            }
        }
    }
    System.out.println(out);
}

并分析更改您的随机生成器http://demesos.blogspot.com/2011/09/replacing-java-random-generator.html

于 2013-06-17T12:46:17.100 回答
1

我怀疑随机数生成是问题所在(尽管您应该避免Random在每次迭代时创建一个新实例)。

Instead, it's probably the innermost loop. Your lookup is O(n), and it should be possible to do it in O(log n). If your list size is large, this would make a massive difference, on average.

For instance, take a look at TreeMap.lowerKey().

于 2013-06-17T12:52:19.873 回答