Java fillRect()不一致

时间:2014-04-19 16:37:11

标签: java performance paint graphics2d fill

可疑fillRect()速度

好的,让我直截了当。 Java通过迭代数组并将rgb值更改为指定颜色来填充矩形。如果只是改变颜色那么为什么Texturepaint如此昂贵,如果它所做的只是改变数组中的整数?更改两者之间的整数需要花时间注册吗?

使用setPaint快速填充fillRect()(new Color());

setPaint(new Color(0,0,0));
fillRect(0,0,frame.getWidth(),frame.getHeight());

// Around 100+ fps repainting with timer set to zero milliseconds.

使用setPaint缓慢填充fillRect()操作(new TexturePaint());

setPaint(new TexturePaint(image, rectangle));
fillRect(0,0,frame.getWidth(),frame.getHeight());

// Around 20+ fps repainting with timer set to zero milliseconds.

1 个答案:

答案 0 :(得分:2)

its sourcecode可以看出,Graphics将此功能委托给子类。

我的实现似乎使用SunGraphics2d,它再次将其委托给PixelFillPipe,其中有许多实现。 OGLRenderer如果可能,使用OpenGL将此功能委托给显卡。 X11Renderer使用本机X调用,如下所示:

native void XFillRect(long pXSData, long xgc,
                      int x, int y, int w, int h);

public void fillRect(SunGraphics2D sg2d,
                     int x, int y, int width, int height)
{
    SunToolkit.awtLock();
    try {
        long xgc = validate(sg2d);
        XFillRect(sg2d.surfaceData.getNativeOps(), xgc,
                  x+sg2d.transX, y+sg2d.transY, width, height);
    } finally {
        SunToolkit.awtUnlock();
    }
}

XRRenderer使用此代码:

public synchronized void fillRect(SunGraphics2D sg2d,
                                  int x, int y, int width, int height) {
    SunToolkit.awtLock();
    try {
        validateSurface(sg2d);

        XRSurfaceData xrsd = (XRSurfaceData) sg2d.surfaceData;

        x += sg2d.transform.getTranslateX();
        y += sg2d.transform.getTranslateY();

        tileManager.addRect(x, y, width, height);
        tileManager.fillMask(xrsd);

    } finally {
        SunToolkit.awtUnlock();
    }
}

我向您展示了这段代码,因为它不仅仅是在数组中设置颜色。您的里程将因平台和JRE而异。

由于我不知道您使用哪种渲染器/填充管,我只能建议您查看自己的代码,但这并不难。