2010-03-02 10 views
9

Tengo un BufferedImage transparente creada con el siguiente código (no es relevante cómo se crea, creo):Borrar un BufferedImage transparente lo más rápido posible

  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 se borra la imagen (imagen vacía en el mismo estado que se creó) de la manera más rápida posible sin volver a crear la imagen? Volver a crear la imagen supone una carga para GC, pausando la máquina virtual y congelando la interfaz de usuario.

Respuesta

16

Lo tengo :) se utiliza 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()); 
+4

'clearRect' se dice que está en desuso desde 1.1, aunque no está etiquetado como tal (¿tal vez porque las anotaciones aún no existían?). La forma preferida es ahora: 'graphics.setComposite (AlphaComposite.Clear); graphics.fillRect (0, 0, SIZE, SIZE); graphics.setComposite (AlphaComposite.SrcOver); '(suponiendo que SrcOver fuera el compuesto que usaste antes, y es el valor predeterminado) Esto está realmente cerca de la implementación de' clearRect'. –

+0

no hay etiqueta de desaprobación en el documento de Java, así que supongo que todavía es válido –

+0

@ adrian.tarau a eso se refiere; anotaciones Los javadocs se generan automáticamente; dado que la anotación '@ Deprecated' no está en el código (aún no existía), entonces no estaba en los javadocs. – Qix

9

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 modifiques y que siempre esté "completamente borrada"/"completamente transparente" y luego haces una copia de la trama, digamos que ha llamado a ese copia clara:

imageYouWantToClear.setData(CLEAR.getRaster()); 

Tenga en cuenta que el trabajo con gráficos puede ser muy difícil cuando se trata de actuaciones debido a que hay una gran cantidad de no muy bien comportamiento documentado. Por ejemplo, sus imágenes (digamos CLEAR) pueden ser aceleradas por hardware pero luego perderían aceleración de hardware tan pronto como usarían un método de mutación (como decir setRgb()) y demostrarían es muy difícil darse cuenta de que acaba de perder el beneficio de la aceleración de hardware.

Creo que el mejor lugar para encontrar información sobre el tema de BufferedImage sería en los programadores de juegos de Java y en la comunidad/foros de programadores de API de juegos de Java.

Por cierto asegúrese de que tanto su BufferedImage está utilizando el modo 'compatible': TYPE_INT_ARGB puede estar bien en Windows, pero no en OS X, etc por lo que desea para crearlos haciendo algo como:

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

Ouch la Ley-de-Demeter duele, gracias Java;)

+0

, gracias WizardOfOdds pero manteniendo otra imagen (que debe ser recreada cuando la imagen "activa" se recrea, porque los límites cambian) aumentará el uso de memoria (piensa en 1600x1200 resolución de la pantalla). clearRect hace el truco y parece bastante rápido. –

Cuestiones relacionadas