Pregunta

Tengo una transparente BufferedImage creada con el siguiente código (no es relevante cómo se crea, creo):

            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);

¿Cómo borro la imagen (imagen vacía en el mismo estado que se creó) de la manera más rápida posible sin recrear la imagen? Recrear la imagen pone una carga sobre GC, deteniendo la VM y congelando la interfaz de usuario.

¿Fue útil?

Solución

Lo tengo :) Usado ClearRect en lugar de llenar con un color transparente.

            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());

Otros consejos

Una forma relativamente rápida, pero no sé si es la más rápida (y me gustaría ver otras respuestas) es tener otra imagen que nunca modifique y que siempre está "totalmente despejado" / "totalmente transparente" y luego Haces una copia de ráster, digamos que nombró esa copia, claro:

imageYouWantToClear.setData( CLEAR.getRaster() );

Tenga en cuenta que trabajar con gráficos puede ser muy complicado cuando se trata de actuaciones porque hay mucho comportamiento no documentado. Por ejemplo, sus imágenes (digamos la clara) mayo Sea acelerado por hardware, pero luego perdería aceleración de hardware tan pronto como use un método de mutación (como digamos un setRGB ()) y resultaría muy difícil darse cuenta de que acabas de perder el beneficio de la aceleración de hardware.

Creo que el mejor lugar para encontrar Infos sobre el tema de BufferedImage de performance sería en los programadores de juegos Java y la comunidad/foros de Java Game-API-Programmers.

Por cierto, asegúrese de que ambos bufferedimage estén utilizando el modo 'compatible': type_int_argb puede estar bien en Windows pero no en OS X, etc. Por lo tanto, desea crearlos haciendo algo como:

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

Ouch, la ley de demanda duele, gracias Java;)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top