GradientPaint/GradientPaint的Java替代方案速度较慢
在Java中使用GradientPaint还有其他替代方法吗 基本上在这个时候,当我用纯色填充应用程序中的所有矩形时,我的代码速度可以接受 但是,一旦我开始使用GradientPaint,那么动作的性能就会下降1秒 例如,一个操作是:单击一个图像,然后该图像以大屏幕弹出 我喜欢保持GradientPaint的外观,因为普通填充看起来很可怕。。。但我不想失去表现。有没有GradientPaint的替代品 我希望我的问题不是太含糊,但GradientPaint似乎太慢了。我曾尝试手动实现GradientPaint,其性能接近Java实现,因此可能表明GradientPaint无法更有效地完成 使用GradientPaint的代码:GradientPaint/GradientPaint的Java替代方案速度较慢,java,Java,在Java中使用GradientPaint还有其他替代方法吗 基本上在这个时候,当我用纯色填充应用程序中的所有矩形时,我的代码速度可以接受 但是,一旦我开始使用GradientPaint,那么动作的性能就会下降1秒 例如,一个操作是:单击一个图像,然后该图像以大屏幕弹出 我喜欢保持GradientPaint的外观,因为普通填充看起来很可怕。。。但我不想失去表现。有没有GradientPaint的替代品 我希望我的问题不是太含糊,但GradientPaint似乎太慢了。我曾尝试手动实现Gradie
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×700像素的2倍
问候。迟了6年才回复,但对于任何找到它的人: 通常,Java绘制实例的工作方式是,它们在幕后分配非常大的光栅(int或字节数组),然后这些光栅会很快被丢弃,并在下次绘制时重新创建。Java2D是以像素为导向的,而这不是现代图形管道的工作方式,这在某种程度上加剧了这种情况 您可以在某些限制范围内解决此问题:如果您只是在进行水平或垂直渐变,则将渐变绘制到与屏幕兼容的BuffereImage(您可以制作一个相当小的图像,并将其垂直或水平平铺)中可能会有更高的性能;根据我的需要,性能提高了20倍左右。下面是一个使用此方法的项目,该方法可用作库:
当然,如果你在做复杂的RadialGradientPaint,那就不可能是平铺的;可以处理任意角度的平铺,但这并不简单-在图形上设置一个变换,使平铺以所需的角度进行,并变换所有形状,使其看起来方向正常。当您提出问题时,请发布一篇帖子。您在其他问题中也被要求获得SSCCE!如果我想把一个SSCCE放在一起解决这个问题,那么它要么包含的信息不够,要么就不再符合SSCCE这个术语。。。相信我,如果我可以把它放在SSCCE中,那么我会的,因为我也想知道答案。此外,还讨论了GradientPaint的性能,但它有点过时了。