gpt4 book ai didi

GradientPaint/GradientPaint 的 Java 替代品速度很慢

转载 作者:行者123 更新时间:2023-12-01 14:41:44 25 4
gpt4 key购买 nike

在 Java 中是否有使用 GradientPaint 的替代方法?

基本上,当我用纯色填充应用程序中的所有矩形时,此时我的代码速度是可以接受的。

但是,一旦我开始使用 GradientPaint,某个操作的性能就会下降 1 秒。

例如一个 Action 是:点击一个图片,然后图片弹出大。

我喜欢保持 GradientPaint 的外观,因为普通填充看起来很糟糕......但我不想失去性能。有 GradientPaint 的替代品吗?

我希望我的问题不是太模糊,但看起来 GradientPaint 太慢了。我尝试手动实现 GradientPaint,其性能接近 Java 实现,因此可能表明 GradientPaint 根本无法更有效地完成。

使用GradientPaint的代码:

private void drawRectangle(final Graphics2D g2d, int width, int height, int x, int y, final int borderSize, final Color color) {        
g2d.setColor(color);
g2d.fillRect(x, y, width, height);

//account for border distance
x += borderSize;
y += borderSize;
width -= 2 * borderSize;
height -= 2 * borderSize;

int mx = (int)Math.round(x + (width / 2));
int my = (int)Math.round(y + (height / 2));

Color colorEdge = alphaColor(color, 192);
Color colorInside = alphaColor(color, 128);

Composite oldComposite = g2d.getComposite();

g2d.setComposite(AlphaComposite.SrcIn);
g2d.setColor(color);
GradientPaint paintQ1 = new GradientPaint(x, y, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ1);
g2d.fillRect(x, y, mx - x, my - y);

GradientPaint paintQ2 = new GradientPaint(x + width - 1, y, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ2);
g2d.fillRect(mx, y, mx - x, my - y);

GradientPaint paintQ3 = new GradientPaint(x, y + height - 1, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ3);
g2d.fillRect(x, my, mx - x, my - y);

GradientPaint paintQ4 = new GradientPaint(x + width - 1, y + height - 1, colorEdge, mx, my, colorInside);
g2d.setPaint(paintQ4);
g2d.fillRect(mx, my, mx - x, my - y);
g2d.setComposite(oldComposite);
}

private Color alphaColor(final Color c1, final int alpha) {
return new Color(c1.getRed(), c1.getGreen(), c1.getBlue(), alpha);
}

每个图像只需调用 3 次,覆盖总面积大约为 500 x 700 像素的两倍。

问候。

最佳答案

迟到了 6 年才回答,但对于找到它的人来说:

一般来说,Java Paint 实例的工作方式是它们在幕后分配非常大的栅格(int 或字节数组),然后这些栅格很快就会被丢弃,并在下次绘制时重新创建。 Java2D 是以插入像素为导向的,而这并不是现代图形管道的工作方式,这一事实在某种程度上使情况变得更加复杂。

您可以在一些限制内解决这个问题:如果您只是进行水平或垂直渐变,则将渐变一次绘制到屏幕中可能会更高效-兼容 BufferedImage(您可以制作相当小的图像并垂直或水平平铺它);根据我的需求,性能提高了大约 20 倍。这是一个使用这种方法的项目,可用作库:https://github.com/timboudreau/visual-library-tabcontrol/tree/master/colors/src/main/java/com/mastfrog/colors

当然,如果您正在做复杂的 RadialGradientPaints,那将无法平铺;它可能可以处理任意角度的平铺,但这并不简单 - 在图形上设置一个变换,以便以所需的角度平铺,并变换所有形状,以便它们看起来正常定向.

关于GradientPaint/GradientPaint 的 Java 替代品速度很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15887346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com