在Java中优化绘制方法

时间:2015-12-16 22:06:24

标签: java optimization graphics drawing

我有一个mandlebrot程序,它将mandlebrot分形绘制到屏幕上。我有一个显示计算速度的计时器,范围从0到10毫秒。我有一个draw(Graphics2D g)方法,它将2维像素数组绘制到屏幕上。计时器显示绘制方法大约需要100毫秒,随着变焦增加,逐渐增加到大约700毫秒。不断调用draw方法,而只在移动或放大mandlebrot时调用mandlebrot计算方法。继承我绘制方法的代码:

public void draw(Graphics2D g) {

    // col and row pixel positions of the pixel being drawn
    // The if statements check if the point is in the mandlebrot set
    // I added a 3 dimensional array just so it could store the color number, and 0 or 1 if it's in the mandlebrot set
    // g.drawLine() draws the pixel at it's location

    for(int col = 0; col < 640; col++) {
        for(int row = 0; row < 480; row++) {
            if(Mandlebrot.pixels[col][row][0] == 1) {
                g.setColor(new Color(Mandlebrot.pixels[col][row][1]));
                g.drawLine(col, row, col, row);
            } else {
                g.setColor(Color.BLACK);
                g.drawLine(col, row, col, row);
            }
        }
    }
}

我认为BufferedImage可能会更快,但是当我尝试它时,我得到了一些奇怪的屏幕gltiches。我也在考虑尝试让多个线程同时呈现屏幕的一部分。因此,可能有1个线程从(0,0)到(100,100)绘制像素,而另一个线程从(0,100)到(100,200)绘制像素,依此类推。有没有更好的方法来做到这一点,并且肯定是由draw方法引起的滞后?还是还有其他阻碍它的东西?当调用计算方法时,程序启动大约10个线程来计算屏幕的某些部分,这会提高性能。线程完成后终止。

这是当前程序的一个可运行的jar: http://www.mediafire.com/download/uh93231z71q27y1/Mandlebrot.jar

1 个答案:

答案 0 :(得分:1)

drawline方法相当昂贵,最好使用BufferedImage,并调用

image.setRGB(int x, int y, int rgb)

表示您需要绘制的所有像素

编辑:正如有人想看到我所说的指标,这是我在我的代码执行非常相似的应用程序中所花费的时间(循环遍历表示像素的数组,并用颜色绘制每个像素)。每个时间都以毫秒为单位,使用System.currentTimeMillis();

使用graphics.drawLine:

Time : 71
Time : 66
Time : 71
Time : 66
Time : 68
Time : 66
Time : 68
Time : 68
Time : 69
Time : 65
Time : 67
Time : 68
Time : 75

with image.setRGB:

Time : 58
Time : 44
Time : 43
Time : 41
Time : 45
Time : 45
Time : 45
Time : 45
Time : 44
Time : 45
Time : 46
Time : 45
Time : 45