Очистите прозрачный BufferedImage максимально быстро

Мне создали прозрачный 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.

10
задан adrian.tarau 2 March 2010 в 22:38
поделиться

2 ответа

Понятно :) использовал 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());
18
ответ дан 3 December 2019 в 15:51
поделиться

Один относительно быстрый способ, но я не знаю, является ли он самым быстрым (и я бы хотел увидеть другие ответы), - это иметь другое изображение, которое вы никогда не изменяете и которое всегда "полностью очищено" / "полностью прозрачно". "а затем вы делаете растровую копию, скажем, вы назвали эту копию 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;)

9
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: