Und wie genau sollte das passieren?
Wenn ich eine wirklich saubere interne Datenrepräsentation will, wie auch im restlichen Programm, so müsste ich einen Gleitkommatypen wählen. Gut ok, hier kein Problem weil nur 0 bis 31
sollte sich in einen Floatingpoint exakt abspeichern lassen. Es gibt aber natürlich auch größere Integer bei denen das nicht mehr ginge und außerdem sind exakte Gleitkommawerte immer problematisch.
Um was für eine Art Verarbeitung geht es da?
Nun, es gibt einen Leveleditor, der leider aber nicht alle Features der Spielengine unterstützt. Im Editor lassen sich Dinge zum Beispiel nur mit rechteckigen Texturausschnitten texturieren, was heutzutage nicht mehr schön ist. Im Levelformat lassen sich aber beliebige Texturkoordinaten angeben, deshalb möchte ich die Daten aus dem Leveleditor in meinen Programm weiterverarbeiten.
Ist die Gefahr, dass, aufgrund der mangelnden arithmetischen Genauigkeit, Artefakte durch Rundungsfehler entstehen, nicht viel realer?
Nein, weil keine Berechnungen in der Binärrepresentation der Spieldaten vorgenommen werden.
Dann mach das einfach, wo liegt das Problem?
Dafür ist das Beispiel oben nicht so optimal.
Es gibt aber auch beispielsweise eine Struktur die so aussieht:
Code: Alles auswählen
struct RoomFlags
{
bool Water : 1;
std::uint8_t Unknown000 : 2;
bool SkyVisible : 1;
bool Unknown001 : 1;
bool BlowHair : 1;
bool Unknown002 : 1;
bool Quicksand : 1; //NL-Flag, Unknown effect
bool Mist : 1; //Unknown effect
bool WaterReflectivity : 1; //R-Flag
bool Unknown003 : 1;
bool FlagD : 1; //No effect
bool FlagP : 1; //No effect
std::uint8_t Unknown003 : 3;
} ;
Es wäre zwar theoretisch möglich, das auseinadern zu nehmen, aber ich sehe nur Nachteile wie den viel höheren Speicherverbrauch und komplexe Bitschiebereien.
Mir gefällt hat einfach die Einfachheit ganze Strukturen mit einen einfachen "iotream::read" einlesen zu können.