# Brauche Hilfe beim Einlesen von PNGs



## RalleYTN (19. Aug 2018)

Ich arbeite gerade an einem Spiel und wollte meinen eigenen PNGReader bauen. Ich kann ganz einfach ImageIO nehmen und das funktioniert dann auch, jedoch ist das ein wenig zu langsam. Mein Ziel ist es die Ladezeit zu beschleunigen indem ich...

1. nicht den Overhead von ImageIO und BufferedImage habe
2. nicht erst das BufferedImage zu ARGB konvertieren muss nur um es dann wieder in ABGR zu konvertieren.
3. es direkt als ein ein dimensionales integer array im ABGR Format einlese
4. unnötige Errorchecks auslasse, da die Texturen für mein Spiel auf jeden Fall korrekt sind

Das ganze funktioniert auch schon für PNGs im ColorType 3 (Indexed).
Ich habe jetzt jedoch ein Problem mit den ColorTypes 2 (RGB) und 6 (RGBA).
Bei ColorType 2 bekomme ich irgendwie nur die Hälfte des Bildes mit selstamen Farben und bei 6 sind die Muster schon richtig jedoch stimmen die Farben nicht.

Mein Source Code kann hier gefunden werden: https://github.com/RalleYTN/Heroica...e/ralleytn/games/heroicafabulis/engine/io/png

Ich habe leider nicht so genau eine Ahnung woran es hakt.

ColorType 6:


ColorType 2:


----------



## httpdigest (19. Aug 2018)

Da du anscheinend sowieso LWJGL 3 verwendest, nimm doch einfach die Bindings zu stb_image -> https://github.com/nothings/stb.
Gehe hierzu auf https://www.lwjgl.org/customize , wähle eine der drei Versionen und unter Contents wähle "stb". Die entsprechende Klasse wäre dann org.lwjgl.stb.STBImage.


----------



## RalleYTN (19. Aug 2018)

httpdigest hat gesagt.:


> Da du anscheinend sowieso LWJGL 3 verwendest, nimm doch einfach die Bindings zu stb_image -> https://github.com/nothings/stb.
> Gehe hierzu auf https://www.lwjgl.org/customize , wähle eine der drei Versionen und unter Contents wähle "stb". Die entsprechende Klasse wäre dann org.lwjgl.stb.STBImage.


Das könnte ich natürlich machen, jedoch würde ich Ziel 4 damit verletzen und durch die unnötigen Errorchecks werden die Ladezeiten wieder verlängert.


----------



## httpdigest (19. Aug 2018)

Naja, was ist denn dein Zeitbudget zum Laden der Bilder? Wann ist es denn _zu langsam_? Hast du stb_image schon mal ausprobiert und geschaut, ob es nicht eventuell _schnell genug_ ist?


----------



## RalleYTN (19. Aug 2018)

In dem Spiel plane ich keine festen Ladevorgänge zu haben, daher sollten 10 Texturen mit ungefähr 256*256 Maßen möglichst ohne Ruckeln bei einem PC der Mittelklasse geladen werden können.
Ich habe noch nicht STB gearbeitet und ich bin extrem zögerlich mit dem Einführen neuer Bibliotheken wenn der Gewinn nicht gut genug ist. Ich hätte dann eine Bibliothek von der ich vielleicht 5% nutze und das auch nur für das Laden von PNGs, daher ist es nicht genug Wert.


----------



## httpdigest (19. Aug 2018)

Was du natürlich auch machen kannst: Während des Installierens (bzw. des erstmaligen Startens) deines Spieles die Bilder entpacken und gleich in einem für das Spiel besten Format auf der Platte abspeichern, z.B. als raw RGBA Bytestream zum Laden in OpenGL.
PNG ist dann also nur ein Transportformat, um den Footprint des Spieles für Download bzw. Speichermedium gering zu halten. Da dein Spiel ja anscheinend sowieso ein Desktop-Spiel ist, kann es auf Platte schon gern ein paar hundert Megabyte groß sein. Und die Performance von sequenziellem Dateilesen ist vermutlich besser als jeder Dekompressionsalgorithmus. Somit kann von der Lade-Performance her eine größere Datei im richtigen Format besser sein als eine kleinere Datei, die aber noch entpackt werden muss. Das muss man aber natürlich messen.


RalleYTN hat gesagt.:


> Ich habe noch nicht STB gearbeitet und ich bin extrem zögerlich mit dem Einführen neuer Bibliotheken wenn der Gewinn nicht gut genug ist. Ich hätte dann eine Bibliothek von der ich vielleicht 5% nutze und das auch nur für das Laden von PNGs, daher ist es nicht genug Wert.


So wie es aussieht, scheinst du also gar keine Vergleichswerte zu haben - außer mit ImageIO (btw. wie viel schneller ist denn dein Loader gegenüber ImageIO?). Vielleicht ist stb ja auch 10x schneller als jeder Loader, den du selber schreiben könntest. Probieren geht über Studieren.


----------



## RalleYTN (19. Aug 2018)

Ein eigenes Dateiformat ohne Kompression zu nutzen ist eine gute Idee.
Werde ich auch gleich umsetzen, jetzt wüsste ich aber trotzdem gerne wo mein Fehler bei dem PNG liegt. Die Muster sind alle klar zu erkennen jedoch ist die Farbe falsch. An falschen dekomprimieren hat es also nicht gelegen und egal wie ich die Farben tausche kommt bloß Mist raus.


----------



## RalleYTN (20. Aug 2018)

Der Link funktioniert nicht mehr, da sich das Package geändert hat.
Hier ist der neue Link: https://github.com/RalleYTN/Heroica...n/games/heroicafabulis/engine/io/textures/png
Inzwischen habe ich EINS der Probleme gefunden.
Das Filter Byte wurde bei nicht indizierten Bildern nicht vernünftig geskippt und er ist auch nicht vernünftig durch alle Pixel gegangen. Jetzt sind nur noch die Farben absoluter Mist und da weiß ich immernoch noch nicht warum.


----------



## JuKu (21. Aug 2018)

Sind die Farben zufällig anders, oder gibt es Auffälligkeiten?
Sind nur die Farben vertauscht, oder passt auch die Position nicht?


----------



## RalleYTN (21. Aug 2018)

JuKu hat gesagt.:


> Sind die Farben zufällig anders, oder gibt es Auffälligkeiten?
> Sind nur die Farben vertauscht, oder passt auch die Position nicht?


Die Position und Muster scheinen in Ordnung zu sein. aber die Farben sind sehr extrem und haben immer einen besonderen Stich (blau, rot, grün, weiß).


----------



## Thallius (21. Aug 2018)

Ohne mir den Code jetzt angesehen zu haben, liegt es eventuell an LittleEndian/BigEndian Problemen?


----------



## RalleYTN (21. Aug 2018)

Thallius hat gesagt.:


> Ohne mir den Code jetzt angesehen zu haben, liegt es eventuell an LittleEndian/BigEndian Problemen?


Nein. Hatte ich schonmal an einer anderen Stelle und habe sie darauf hin gefixt. Big und Small endian wird bei mir in den Klassen IOUtil und BinaryUtil (im util package) verwaltet.


----------



## Blanco77 (10. Okt 2018)

C'est pas normal! 
Il s'agit simplement d'un format d'image. 

Vous êtes sûr de la source de votre fichier, il peut être corrompu, ou peut être modifié. 
Quel est sa taille?


----------



## VfL_Freak (10. Okt 2018)

Moin,



Blanco77 hat gesagt.:


> C'est pas normal!
> Il s'agit simplement d'un format d'image.
> 
> Vous êtes sûr de la source de votre fichier, il peut être corrompu, ou peut être modifié.
> Quel est sa taille?


dies ist ein deutschsprachiges Forum !!! 

VG Klaus


----------



## Blanco77 (11. Okt 2018)

C'est pas normal! 
Il s'agit simplement d'un format d'image. 

Vous êtes sûr de la source de votre fichier qui est  CCleaner Happy Wheels VLC , il peut être corrompu, ou peut être modifié. 
Quel est sa taille?


----------

