Java - 填充矩形的最快方法

时间:2015-03-22 16:12:55

标签: java optimization graphics

我更喜欢使用自己的方法在Java中绘制东西。我使用这两种方法来填充矩形:

public static void drawPixel(Vector2 position) { 
    g.drawLine((int) position.getX(), (int) position.getY(), (int) position.getX(), (int) position.getY()); 
}
public static void fill(Rectangle area) {
    for (int x = (int) area.getTopLeft().getX(); x <= (int) area.getBottomRight().getX(); x++) {
        for (int y = (int) area.getTopLeft().getY(); y <= (int) area.getBottomRight().getY(); y++) {
            drawPixel(new Vector2(x, y));
        }
    }
}

当我使用这种填充方法每帧填充窗口以绘制背景时,它变得非常慢。我该怎么做才能优化它?

我还使用自己的线条绘制方法,以避免计算机上没有准确绘制线条的错误。 自定义行方法:

public static void drawLine(Line line) {
    double x2 = line.getEnd().getX(), x1 = line.getStart().getX(), y2 = line.getEnd().getY(), y1 = line.getStart().getY();
    // delta of exact value and rounded value of the dependent variable
    int d = 0;
    int dy = (int) Math.abs(y2 - y1);
    int dx = (int) Math.abs(x2 - x1);
    int dy2 = (dy << 1); // slope scaling factors to avoid floating
    int dx2 = (dx << 1); // point
    int ix = x1 < x2 ? 1 : -1; // increment direction
    int iy = y1 < y2 ? 1 : -1;
    if (dy <= dx) {
        for (;;) {
            drawPixel(new Vector2(x1, y1));
            if (x1 == x2)
                break;
            x1 += ix;
            d += dy2;
            if (d > dx) {
                y1 += iy;
                d -= dx2;
            }
        }
    } else {
        for (;;) {
           drawPixel(new Vector2(x1, y1));
            if (y1 == y2)
                break;
            y1 += iy;
            d += dx2;
            if (d > dy) {
                x1 += ix;
                d -= dy2;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

使用drawLine绘制单个像素似乎不是一个好主意。为什么不直接使用drawLine绘制线条,从而删除内部循环?

我对JAVA一点都不了解,但是我发现从循环测试条件中调用一个方法,只检查索引变量是否已达到最终值,这似乎是一个很大的开销对我来说。我宁愿使用变量来缓存相关值,这些值不会发生变化,并在测试条件下使用它。

public static void fill(Rectangle area) {
    int y1 = (int) area.getTopLeft().getY();
    int y2 = (int) area.getBottomRight().getY();
    int x2 = (int) area.getBottomRight().getX();
    for (int x = (int) area.getTopLeft().getX(); x <= x2; x++) {
        g.drawLine (x, y1, x, y2);
    }
}