# PNG im Speicher



## Titanpharao (6. Sep 2009)

Hallo Leute,

ich habe mir für mein Spiel eine eigene PNG Animation geschrieben. (hatte davor immer eine fertige GIF Animation genutzt, was aber nicht so hübsch und flexibel ist)

Nun lade 7 PNG bilder rein um damit meine Animation zu erstellen. Die bilder haben eine größe von 448x448 und sind zu ~50% Transparent.

Mein Problem ist jetzt , das der Speicher beim laden und halten(im RAM) um über 7MB ansteigt

ist das normal? Wie kann ich das umgehen?


----------



## Marco13 (6. Sep 2009)

Kommt drauf an, wie groß die Bilder sind 

Der Speicherbedarf für ein Bild ist _mindestens_ breite * höhe * 4 bytes - in der Praxis kann's noch ein Stück mehr sein.


----------



## musiKk (6. Sep 2009)

Normal ist das, ja. PNG komprimiert die Bilder für die Festplatte, wenn sie angezeigt werden sollen, müssen sie immer entpackt werden (gilt natürlich auch für alle anderen Formate). Dann kannst Du Dich an der Formel von Marco13 orientieren, welche in Deinem Fall etwas mehr als 5 MB ergibt.
Vielleicht hilft es ja, wenn Du APNG verwendest. Da weiß ich aber nicht, wie es mit der Unterstützung aussieht.


----------



## Titanpharao (6. Sep 2009)

448 x 448 Pixel mit 


```
ImageIO.read(new File(pfad));
```

hohle ich mir die Bilder und spiegel/drehe sie noch.

Das ist doch blöd, naütrlich kann ich sie auch nicht im Speicher halten, aber dann dauert das Laden immer so lange.

Es gibt in meinem Spiel >70 Animationen die zum Teil noch in 4 Richtungen erzeugt werden müssen.

=>200 Animationen @ durchschnittlich 5 Bilder => 1000MB Speicher?! Wunderbar mein 2D Spiel kann mit aktuellen Spielen in Sachen RAM verbrauch mithalten ~.~ ---

Aber die Gif Animation waren immer total klein ...

bzw APNG, hatte ich mir mal angesehen aber es gibt keine richtige LIB die das liest ... bzw habe ich es mir schon selbst gebaut sozusagen


----------



## Evil-Devil (7. Sep 2009)

Ist denn "alles" auf deinen Bildern animiert oder nur Aussschnitte? Denn sonst solltest du den nicht animierten Part in ein eigenes Bild auslagern und nur den wirklichen animierten Teil in deinem animierten PNG speichern. Das sollte dir einiges an Speicher freihalten.


----------



## musiKk (7. Sep 2009)

Bei GIF (und sicher auch APNG) wird auf diese Weise auch Speicherplatz gespart. Bei GIF kommt natürlich noch hinzu, dass nicht mehr als 256 Farben gehen...


----------



## Titanpharao (7. Sep 2009)

Ne alles in dem Bild gehört zur Animation dazu ... egal der User kann nun zwischen GIF / PNG Animationen auswählen^^

Aber wie machen die das dann bei 3D Spielen, wo haufenweise Texturen benutzt werden, die teilweise 512x512 groß sind. Da müste der Speicher doch sofort volllaufen.


----------



## Evil-Devil (7. Sep 2009)

Die sind zum einen meist komprimiert (DDS) und können von den Grafikkarten im komprimierten Zustand verwendet werden. Und bei reinen Textur-Animationen ist wirklich nur die Animation in der Textur gespeichert und zumeist in einer einzelnen. Zb. eine Feueranimation die 32x64 groß ist und aus 32 Einzelbildern besteht würde sich in einer 256x256 Textur abspeichern lassen.

Oder bei Diablo 2 zb. sind die einzelnen Animationen nochmals in Teilanimationen unterteilt. Sprich Kopf, Oberkörper, Unterkörper, etc. Das sind entsprechend sehr viele kleine Dateien, aber da kann man durch die geringen Bildausmaße auch mehr Daten kompakt speichern. Zb. mit einer Farbpalette.

Und sonst bei allen aktuellen AAA Spielen wird Texture-Streaming verwendet.
//edit:
Hier sonst noch ein kleiner PDF Artikel zu dem Thema: http://www.insomniacgames.com/tech/articles/1107/files/texture_streaming.pdf


----------



## Steev (7. Sep 2009)

http://www.insomniacgames.com/tech/articles/1107/files/texture_streaming.pdf

Dieser Link funktioniert.


----------

