fillPolygon极大地减慢了我的应用程序

时间:2014-05-09 19:33:22

标签: java bufferedimage graphics2d

我正在创建一个http://alteredqualia.com/visualization/evolve/的java植入,作为一个爱好项目。我使用HW加速的Graphics2D在bufferedImage上绘制多边形,这是有效的,但是调用fillPolygon()这么多次会使应用程序在速度方面瘫痪。

所以现在我的问题是:有没有办法加快这个过程?

private BufferedImage createImage() //Gets called once
{
    BufferedImage           bImage  = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
                            bImage.setAccelerationPriority(1);
    Graphics2D              g2d     = (Graphics2D) bImage.getGraphics();
                            g2d.setRenderingHint(
                                RenderingHints.KEY_ANTIALIASING,
                                RenderingHints.VALUE_ANTIALIAS_ON);
                            g2d.setRenderingHint(
                                RenderingHints.KEY_COLOR_RENDERING,
                                RenderingHints.VALUE_COLOR_RENDER_SPEED);
    this.g2d = g2d;

    return bImage;
}
private void reDraw() //Gets called every frame
{
    drawBackground(g2d);

    for(int i = 0; i < polygonList.getLength(); i++)
    {
        polygonList.get(i).draw(g2d);
    }
}
public void draw(Graphics2D g2d)
{
    if(rgba[3] != 0f)
    {
        g2d.setColor(new Color(rgba[0], rgba[1], rgba[2], rgba[3]));
        g2d.fillPolygon(this);
    }
}

1 个答案:

答案 0 :(得分:0)

通过使用java.awt.Graphics,除了通常的Java优化(减少对象创建和函数调用等)之外,您无法在最后提高性能。然而,你可以选择它在RenderHint的结尾呈现的方式,正如我所看到的那样;我建议你设置所有提示速度,包括禁用抗锯齿,因为这实际上是最大的点击之一。

除此之外,我可以看到你正在使用我可以假设的一些数组并用它们创建颜色,现在我不确定这是什么类(假设它全部来自一个类,请纠正我) - 尽管如此if语句可能是一个返回(它不会有太多帮助),你应该在它改变时缓存这个颜色,我建议不要使用rgba数组并使用一个全局颜色如果您需要它们,请使用getRed/Green/Blue

如果您想获得更多建议,可以将其移至Code Review