GradientPaint/GradientPaint的Java替代方案速度较慢

GradientPaint/GradientPaint的Java替代方案速度较慢,java,Java,在Java中使用GradientPaint还有其他替代方法吗 基本上在这个时候,当我用纯色填充应用程序中的所有矩形时,我的代码速度可以接受 但是,一旦我开始使用GradientPaint,那么动作的性能就会下降1秒 例如,一个操作是:单击一个图像,然后该图像以大屏幕弹出 我喜欢保持GradientPaint的外观,因为普通填充看起来很可怕。。。但我不想失去表现。有没有GradientPaint的替代品 我希望我的问题不是太含糊,但GradientPaint似乎太慢了。我曾尝试手动实现Gradie

在Java中使用GradientPaint还有其他替代方法吗

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

但是,一旦我开始使用GradientPaint,那么动作的性能就会下降1秒

例如,一个操作是:单击一个图像,然后该图像以大屏幕弹出

我喜欢保持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×700像素的2倍


问候。

迟了6年才回复,但对于任何找到它的人:

通常,Java绘制实例的工作方式是,它们在幕后分配非常大的光栅(int或字节数组),然后这些光栅会很快被丢弃,并在下次绘制时重新创建。Java2D是以像素为导向的,而这不是现代图形管道的工作方式,这在某种程度上加剧了这种情况

您可以在某些限制范围内解决此问题:如果您只是在进行水平或垂直渐变,则将渐变绘制到与屏幕兼容的BuffereImage(您可以制作一个相当小的图像,并将其垂直或水平平铺)中可能会有更高的性能;根据我的需要,性能提高了20倍左右。下面是一个使用此方法的项目,该方法可用作库:


当然,如果你在做复杂的RadialGradientPaint,那就不可能是平铺的;可以处理任意角度的平铺,但这并不简单-在图形上设置一个变换,使平铺以所需的角度进行,并变换所有形状,使其看起来方向正常。

当您提出问题时,请发布一篇帖子。您在其他问题中也被要求获得SSCCE!如果我想把一个SSCCE放在一起解决这个问题,那么它要么包含的信息不够,要么就不再符合SSCCE这个术语。。。相信我,如果我可以把它放在SSCCE中,那么我会的,因为我也想知道答案。此外,还讨论了GradientPaint的性能,但它有点过时了。