绘制bufferedimages时Java 2D的性能问题

时间:2010-02-17 06:22:25

标签: java performance image rendering 2d

我正在设计一个Canvas对象,用于绘制尺寸为228x262像素的BufferedImage。

该图像是使用Graphics2D.drawImage(...)方法绘制的。我正在给定的偏移范围内进行像素基色操作。以下代码示例:

for( int i = frameOffset; i < colorClock; i++ ) {  
    rgb[i] = new Color(this.colorBK).getRGB();  
    }

其中 rbg 设置为我正在改变的bufferedimage 问题是代码绘制速度慢。

我正在使用GraphicsConfiguration.createCompatibleImage创建图像,我正在通过缓冲策略使用双缓冲。

好吗?

感谢adv。

2 个答案:

答案 0 :(得分:1)

如果每次绘制图像时都运行循环,则循环可能是瓶颈。有一个完全不必要的对象分配,这将使垃圾收集器经常运行。

我假设colorBK是int。如果是这种情况,您只需创建并初始化Color对象并要求它返回分配给rgb数组的rgb值。实际发生的是你在rgb数组中分配colorBK的值。因此,等效且更有效的实现将是rgb [i] = colorBK。

为了进一步优化,您可以将colorBK的值分配给最终的局部变量。这样可以避免一遍又一遍地获取字段的值。所以循环可能如下所示:

final int color = colorBK;
for( int i = frameOffset; i < colorClock; i++ ) {
    rgb[i] = color;
}

为了获得更多的性能提升,您应该认为,如果有完全不同的方式来做到这一点。由于上面的示例只是将某些像素更改为某种颜色,我可以假设这可以通过图像和几个fillRect来完成。

因此,您可以使用所需的颜色(在本例中为colorBK)填充图像后面的矩形。如果图像在这些区域中具有透明像素,则上述循环改变它们在画布中保持不变并且获得相同的效果。这可能更有效,因为图形方法得到了更好的优化,并且不涉及大量阵列使用。

答案 1 :(得分:0)

不要仅为图像中的每个像素提取RGB整数来创建新颜色。我可以为Color找到的唯一一个参数构造函数是一个采用int RGB的构造函数 - 你不能直接使用colorBK吗?

另外,如果你在每一个慢速的油漆上进行这种转换;你应该只需要进行一次转换。