有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我正在设计一个画布对象,用于绘制228x262像素的BuffereImage

该图像是使用Graphics2D绘制的。drawImage(…)方法我在给定的偏移范围内进行基于像素的颜色处理。下面是代码示例:

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

其中,rbg被设置为我要更改的缓冲区图像
问题是代码绘制速度很慢

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

有灯吗

谢谢adv


共 (2) 个答案

  1. # 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)填充图像后面的矩形。如果图像在这些区域中有透明像素,则上述循环会发生变化,它们在画布中保持不变,并获得相同的效果。这可能更有效,因为图形方法得到了更好的优化,并且不涉及大量的数组使用

  2. # 2 楼答案

    不要仅仅为了为图像中的每个像素提取RGB整数而创建新颜色。我能找到的唯一一个颜色单参数构造函数是一个接受int RGB的构造函数——你能不能不直接使用colorBK

    而且,如果你在每一种颜料上都进行这种转换,速度会很慢;你只需要做一次转换