可疑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.
答案 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而异。
由于我不知道您使用哪种渲染器/填充管,我只能建议您查看自己的代码,但这并不难。