# Welcher Image Typ am besten für 2D-Spiele geeignet?



## Dirt Devil (28. Apr 2007)

Hey Leute,

ich schreibe ein kleines Action-Spielchen als Applet. Dabei hab ich gelesen, dass es Unterschiede zwischen den einzelnen Image Typen gibt (beispielsweise bufferedimage und compatibleimage usw.)
jetzt wollt ich mich erkundigen, welcher typ für diese art von spielen am besten geeignet ist (also welcher typ sich am schnellsten aufbaut bzw. welcher typ die geringste Rechenpower benötigt).

Danke,
Dirt Devil


----------



## Marco13 (28. Apr 2007)

Eigentlich gibt es nur zwei Typen, die von Image erben. Der erste ist BufferedImage, mit dem man meistens hantiert. Der zweite ist VolatileImage, der irgendwie direkt auf den VRAM der Grafikkarte zugreift, und deswegen vmtl. in vielen Fällen schneller (und daher für Spiele besser geeignet) ist.


----------



## Dirt Devil (1. Mai 2007)

Ich danke dir für diese Information. Mal sehen, ob ich das Spiel damit beschleunigen kann   
MfG, Dirt Devil


----------



## Quaxli (1. Mai 2007)

Wie groß ist Dein Spiel eigentlich? Ich habe den Eindruck als könnte Dein Geschwindigkeitsproblem am Code liegen und nicht an der Art der Images. 
Ich persönlich verwende i. d. R. BufferedImages und habe bisher noch keine Probleme mit der Geschwindigkeit gehabt, auch wenn relativ viele Grafiken erforderlich sind.


----------



## 0xdeadbeef (1. Mai 2007)

Es gibt noch etwas zwischen VolatileImage und BufferedImage, nämlich "managed" Images: wenn man ein BufferedImage per "createCompatibleImage" erzeugt, dann kann es ebenfalls hardwarebeschleunigt gezeichnet usw. werden. Wobei ich auch mal irgendwo gelesen habe, daß seit der Version 5 o.ä. die Hardwarebeschleunigung überall verwendet wird, wo es irgendwie geht. Mit "createCompatibleImage" macht man es der JVM aber besonders leicht, weil die Farbtiefe usw. ja der augenblicklichen Einstellung entspricht.
VolatileImages mögen noch einen Tick schneller sein, aber dafür hat man das Problem, daß sie jederzeit überschrieben werden können. Man muß sich also für jedes VolatileImage bei jeder Verwendung per contentsLost() abfragen, ob es überhaupt noch seinen gewünschten Inhalt hat.
Sowas lohnt sich also bestenfalls für einen Screenbuffer, nicht für jeden popeligen Sprite.

Ich benutze bei Lemmini z.B. ausschließlich per createCompatibleImage() erzeugte Images und sehe dadurch keine Performanceprobleme, obwohl pro Frame u.U. über 100 Objekte plus die große Hintergrundgrafik in dem Offscreenbuffer zeichne und den dann nochmal komplett (weil windowed) in den Screenbuffer kopiere.


----------



## m@nu (1. Mai 2007)

```
/**
     * Erstellt aus einem <code>BufferedImage</code> ein Systemkompatibles
     * <code>BufferedImage</code>. Performance solcher Bilder ist höher beim
     * Zeichnen.
     * 
     * @param image
     * @return
     */
    public BufferedImage toCompatibleImage(BufferedImage image) {
        GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice d = e.getDefaultScreenDevice();
        GraphicsConfiguration c = d.getDefaultConfiguration();
        
        BufferedImage compatibleImage = c.createCompatibleImage(
                image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB_PRE);
        Graphics g = compatibleImage.getGraphics();
        
        g.drawImage(image, 0, 0, null);
        g.dispose();
        
        return compatibleImage;
    }
```

vll ja jemandem hilfreich an dieser stelle 

<edit>
weitere performance verbesserung kann dadurch erreicht werden, dass du als imageObserver immer null verwendest (siehe auch oben im code snippet)
</edit>


----------

