我更喜欢使用自己的方法在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;
}
}
}
}
答案 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);
}
}