Java 尽快清除透明缓冲区图像

Java 尽快清除透明缓冲区图像,java,awt,bufferedimage,graphics2d,Java,Awt,Bufferedimage,Graphics2d,我使用以下代码创建了一个透明的BuffereImage(我认为它与创建方式无关): 如何在不重新创建图像的情况下以尽可能快的方式清除图像(与创建时处于相同状态的空图像)?重新创建图像会给GC带来负担,暂停VM并冻结UI。一种相对快速的方法,但我不知道它是否最快(我希望看到其他答案),就是拥有另一张您从未修改过的图片,它总是“完全清除”/“完全透明”,然后您进行光栅复制,假设您将该副本命名为CLEAR: imageYouWantToClear.setData( CLEAR.getRaster()

我使用以下代码创建了一个透明的BuffereImage(我认为它与创建方式无关):


如何在不重新创建图像的情况下以尽可能快的方式清除图像(与创建时处于相同状态的空图像)?重新创建图像会给GC带来负担,暂停VM并冻结UI。

一种相对快速的方法,但我不知道它是否最快(我希望看到其他答案),就是拥有另一张您从未修改过的图片,它总是“完全清除”/“完全透明”,然后您进行光栅复制,假设您将该副本命名为CLEAR:

imageYouWantToClear.setData( CLEAR.getRaster() );
请注意,当涉及性能时,使用图形可能会非常棘手,因为存在许多没有很好记录的行为。例如,你的图像(比如清晰的图像)可能是硬件加速的,但一旦你使用了一种变异方法(比如setRgb()),你就会失去硬件加速,而事实证明你很难意识到你刚刚失去了硬件加速的好处

我认为在Java游戏程序员和Java游戏API程序员社区/论坛中可以找到有关performant BuffereImage主题的信息

顺便说一句,请确保您的两个BuffereImage都使用“兼容”模式:在Windows上键入\u INT\u ARGB可能没有问题,但在OS X上则没有问题。因此,您希望通过以下方式创建它们:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
哎哟,得墨忒尔定律很伤人,谢谢Java;)

明白了:)使用clearRect而不是透明颜色填充

            graphics = (Graphics2D) offlineBuffer.getGraphics();
            graphics.setBackground(new Color(255, 255, 255, 0));
            Rectangle screen = transformationContext.getScreen();
            graphics.clearRect(0,0, (int)screen.getWidth(), (int)screen.getHeight());

感谢WizadoFodds,但保留另一个图像(由于边界更改,在重新创建“活动”图像时需要重新创建该图像)将增加内存使用率(想想1600x1200屏幕分辨率)。clearRect做到了这一点,而且速度似乎相当快。我在Windows 10上用Java 8尝试了这一点,但比
clearRect()
慢了约50倍。据说从1.1开始,clearRect就被弃用了,尽管它没有被标记为这样(可能是因为注释还不存在?)。现在首选的方法是:
graphics.setComposite(AlphaComposite.Clear);graphics.fillRect(0,0,SIZE,SIZE);graphics.setComposite(AlphaComposite.SrcOver)
(假设SrcOver是您以前使用的组合,并且是默认值),这实际上接近于
clearRect
的实现。java文档中没有弃用标记,因此我认为它仍然是valid@adrian.tarau这就是他所指的;注释。javadocs是自动生成的;由于
@Deprecated
注释不在代码中(它还不存在),因此它不在javadocs中。这是可行的,但文本呈现似乎受启用抗锯齿时选择的背景颜色的影响。我使用
新颜色(0,0,0,0)
获得了更好的结果。
            graphics = (Graphics2D) offlineBuffer.getGraphics();
            graphics.setBackground(new Color(255, 255, 255, 0));
            Rectangle screen = transformationContext.getScreen();
            graphics.clearRect(0,0, (int)screen.getWidth(), (int)screen.getHeight());