12

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

            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();

            Rectangle screen = transformationContext.getScreen();

            // Create an image that supports transparent pixels
            return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(),
                    Transparency.BITMASK);

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

4

2 回答 2

20

明白了:) 使用 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());
于 2010-03-02T22:55:45.257 回答
9

一种相对较快的方法,但我不知道它是否是最快的(我希望看到其他答案)是拥有另一张您从不修改并且始终“完全清除”/“完全透明”的图片,然后你做了一个光栅副本,假设你将该副本命名为 CLEAR:

imageYouWantToClear.setData( CLEAR.getRaster() );

请注意,在性能方面使用图形可能非常棘手,因为有很多没有很好记录的行为。例如,您的图像(例如 CLEAR 图像)可能是硬件加速的,但是一旦您使用变异方法(例如setRgb()),您就会失去硬件加速,而且事实证明很难实现你刚刚失去了硬件加速的好处。

我认为查找有关高性能 BufferedImage 主题的信息的最佳位置是 Java 游戏程序员和 Java 游戏 API 程序员社区/论坛。

顺便说一句,确保您的 BufferedImage 都使用“兼容”模式: TYPE_INT_ARGB 在 Windows 上可能很好,但在 OS X 等上则不行,所以你想创建它们,如下所示:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);

哎呀,得墨忒耳法则很痛,感谢 Java ;)

于 2010-03-02T22:50:53.963 回答