我正在设计一个 Canvas 对象,用于绘制大小为 228x262 像素的 BufferedImage。
该图像是使用 Graphics2D.drawImage(...) 方法绘制的。我正在给定的偏移范围内进行基于像素的颜色操作。下面的代码示例:
for( int i = frameOffset; i < colorClock; i++ ) {
rgb[i] = new Color(this.colorBK).getRGB();
}
其中 rbg 设置为我要更改的缓冲图像。
问题是代码绘制速度很慢。
我使用 GraphicsConfiguration.createCompatibleImage 创建图像,并通过缓冲区策略使用双缓冲。
请问有灯吗?
谢谢你的广告。
最佳答案
如果每次绘制图像时都运行循环,则循环可能是瓶颈。有一个完全不必要的对象分配,这将使垃圾收集器频繁运行。
我假设 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)填充图像后面的矩形。如果图像在这些区域中具有透明像素,则上述循环会发生变化,它们在 Canvas 中保持不变,并获得相同的效果。这可能会更有效,因为图形方法得到了更好的优化,并且不涉及大量的数组使用。
关于java - 绘制缓冲图像时 Java 2D 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2278712/