java - 绘制缓冲图像时 Java 2D 的性能问题

标签 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 设置为我要更改的缓冲图像。
问题是代码绘制速度很慢。

我使用 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/

相关文章:

sql - MySQL 中的两个单列索引与一个两列索引?

存储过程和 Entity Framework 的性能

python - Python 中无开销的有意义的 IO 错误消息

java - (JavaFX FXML) 在尝试制作自定义按钮时,如何获取图像完全填充按钮?

iphone - 从 CGImageGetDataProvider 返回的数据长度大于预期

java - 升级到 Roboguice 3 后注入(inject)的对象变为空

java - 无法使用 Java 客户端连接到 Raspberry Pi 上的 MySQL

java - 接受 05/05/1999 和 5/5/1999 等的日期时间解析

java - 同步搜索和修改

android - Android GridView 中的图像发生变化。如何?