Domanda

Ho un BufferedImage trasparente creata con il seguente codice (non rilevante come viene creato, credo):

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

Come faccio a cancellare l'immagine (immagine vuota nello stesso stato in cui è stato creato) nel modo più veloce possibile, senza ricreare l'immagine? Ricreare le mette immagine un onere per GC, fermandosi la VM e il congelamento l'interfaccia utente.

È stato utile?

Soluzione

Si è utilizzato :) clearRect invece di riempimento con un colore trasparente.

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

Altri suggerimenti

Un modo relativamente veloce, ma non so se è il più veloce (e mi piacerebbe vedere altre risposte) è di avere un'altra immagine che non si modificano e che è sempre "di ogni genere" / "completamente trasparente "e poi si fa una copia raster, dici hai nominato che copia CLEAR:

imageYouWantToClear.setData( CLEAR.getRaster() );

Si noti che lavora con la grafica può essere molto difficile quando si tratta di prestazioni, perché ci sono un sacco di comportamento non-molto-ben documentato. Per esempio le immagini (ad esempio quello CLEAR) possono essere accelerazione hardware ma si sarebbe poi perdere accelerazione hardware non appena si userebbero un metodo mutazione (come dire una setRGB ( ) ) e sarebbe rivelarsi molto difficile rendersi conto che hai appena perso il beneficio di accelerazione hardware.

Credo che il posto migliore per trovare informazioni in materia di BufferedImage performante sarebbe in gioco java-programmatori e game-Java API-programmatori della comunità / forum.

A proposito assicurarsi che sia il BufferedImage sta utilizzando la modalità 'compatibile': TYPE_INT_ARGB può andare bene su Windows ma non su OS X, ecc in modo che si desidera creare loro fare qualcosa di simile:

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

Ouch la legge-di-Demetra fa male, grazie Java;)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top