Bemerkung: Abgetrennt von Apos Spielesammelthread.
Es geht um schlechte Performance von BufferedImages.
Das Problem ist nicht so unbekannt. Dass das Laden länger dauert könnte an der Kompression liegen (da gibt's bei PNG auch verschiedene), aber das Laden ist meistens das geringste Problem.
Das kritische ist das Zeichnen: Wenn man PNGs lädt, dann haben die (meistens?) den Typ "TYPE_CUSTOM". Ich hatte da mal in den Tiefen des Sun-Quellcodes gewühlt, die leicht vereinfachte Quintessenz: RICHTIG schnell wird das ganze nur mit TYPE_INT_*, ganz grob: weil diese Bilder "Managed" sein können und Sun da magische Optimierungen (mit VRAM-Nutzung und was weiß ich) veranstalten kann. Bei allen anderen Typen muss praktisch bei jedem Zugriff auf einen einzelnen Pixel eine absurd-aufwändige Konvertierung der Pixel über ColorModel und irgendwelche Bands und so gemacht werden, damit am Ende ein 32bit int mit der passenden Reihenfolge von RGB und A rauskommt (auch wenn das beim Zeichnen "blockweise" gemacht wird, ist es gähnend langsam).
Meine "Faustregel" wenn es darum geht, Bilder schnell auf den Bildschirm zu bringen: Genau das, was du jetzt gemacht hast Das Bild laden und als allererstes in ein TYPE_INT_* Bild reinmalen. Kürzlich hatte ich in http://www.java-forum.org/spiele-multimedia-programmierung/120102-pixel-bufferedimage-bearbeiten-performance.html#post775119 auch ein paar (teilweise vielleicht etwas veraltete, aber zumindest interessante) Links dazu gepostet, aber im Web und dem Sun-Sourcecode findet man da noch mehr.
Es geht um schlechte Performance von BufferedImages.
Das Problem ist nicht so unbekannt. Dass das Laden länger dauert könnte an der Kompression liegen (da gibt's bei PNG auch verschiedene), aber das Laden ist meistens das geringste Problem.
Das kritische ist das Zeichnen: Wenn man PNGs lädt, dann haben die (meistens?) den Typ "TYPE_CUSTOM". Ich hatte da mal in den Tiefen des Sun-Quellcodes gewühlt, die leicht vereinfachte Quintessenz: RICHTIG schnell wird das ganze nur mit TYPE_INT_*, ganz grob: weil diese Bilder "Managed" sein können und Sun da magische Optimierungen (mit VRAM-Nutzung und was weiß ich) veranstalten kann. Bei allen anderen Typen muss praktisch bei jedem Zugriff auf einen einzelnen Pixel eine absurd-aufwändige Konvertierung der Pixel über ColorModel und irgendwelche Bands und so gemacht werden, damit am Ende ein 32bit int mit der passenden Reihenfolge von RGB und A rauskommt (auch wenn das beim Zeichnen "blockweise" gemacht wird, ist es gähnend langsam).
Meine "Faustregel" wenn es darum geht, Bilder schnell auf den Bildschirm zu bringen: Genau das, was du jetzt gemacht hast Das Bild laden und als allererstes in ein TYPE_INT_* Bild reinmalen. Kürzlich hatte ich in http://www.java-forum.org/spiele-multimedia-programmierung/120102-pixel-bufferedimage-bearbeiten-performance.html#post775119 auch ein paar (teilweise vielleicht etwas veraltete, aber zumindest interessante) Links dazu gepostet, aber im Web und dem Sun-Sourcecode findet man da noch mehr.
Zuletzt bearbeitet von einem Moderator: