我有一个透明的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。
答案 0 :(得分:18)
搞定了:)使用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());
答案 1 :(得分: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,所以Demeter法则会受到伤害;)