Java - 填充矩形的最快方法

标签 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));
        }
    }
}

当我使用这种填充方法来填充窗口的每一帧以绘制背景时,它变得非常慢。我可以做些什么来优化它?

我也是用自己的画线方法,为了避免自己电脑出现画线不准的BUG。 自定义行方法:

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;
            }
        }
    }
}

最佳答案

使用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);
    }
}

关于Java - 填充矩形的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29196697/

相关文章:

c# - 在内存中固定指针数组

java - 如何在 JList 之外使用自定义 JList 渲染器的结果?

java - 如何使用双参数的drawImage()方法

optimization - 在循环内与循环外分配内存

c++ - 为什么在第三个文件之前写入两个文件,即使指令是每次迭代都执行一个文件?

java - 用 Java 为简单的棋盘游戏创建图形

java - android ListView 中的 Font Awesome 不起作用

java - 从具有一定概率的字符串列表生成随机字符串

java - 计数数组的行为

java - 如何读取文件,然后将每个文件整数分配给数组列表?