World-Datei möglichst klein speichern?

Servo Herko

Aktives Mitglied
Hallo,
ich habe eine World-Datei in der ich Blöcke rein speicher (z.b. x = 50, y = 50, id = 50 also "50 50 50 ")...
Die Welt ist eigentlich klein, aber trotzdem werden schon 2000 Blöcke abgespeichert...

Und es werden eh später mehr Parameter hinzugefügt und noch viel mehr Blöcke, also kann es so nicht weiter gehen, da es zu viel Platz verbraucht!

Könnt ihr mir ein paar Tipps geben wir ich das am besten machen soll?

Vielen Dank 🙂
 
hier hilft wohl komprimierung

du könntest z.b. statt die daten so zu speichern GZip*Stream nutzen um daten gzip zu speichern, das spart schon mal etwas, braucht aber bei häufigen zugriffen auch mehr leistung

klassiker : Minecraft
hier wird mit einem zugegeben nicht so optimalen protokoll und gzip gearbeitet
damit jetzt aber nicht viel leistung für die verarbeitung der daten drauf geht werden die aktuell genutzten chunks im RAM gehalten und nur die inaktiven gespeichert
das format nennt sich NBT und ist hier erklärt : NBT format - Minecraft Wiki
sinn ist es das man statt "50 50 50" als string schreibt direkt auf byte-ebene arbeitet
es wird zwar viel INT genutzt, aber wenn deine welt nicht so groß wird kannst du natürlich auch einen kleineren datentyp wählen

du würdest aktuell 8byte für 2 positionen und 1 type nutzen
drückt man das ganze z.b. in short (weil byte wäre halt dann doch zu klein) so kommt man für die position auf 6byte (wertebereich short -2^15 bis +2^15-1)
so würde also die angabe "50 50 50" von 8byte auf 6byte gekürzt
macht sich vor allem desshalb sinnvoll weil so erstens die leerzeichen zur trennung wegfallen und zweitens eine feste struktur vorhanden ist
z.b. wäre die angabe "250 250 250" schon ganze 11byte lang ... in der anderen schreibweise aber trotzdem nur 6byte

außerdem dürfte es die arbeit für gzip vereinfachen da eine höhere entropie-rate entsteht



wäre jetzt so spontan ein beispiel auf die fragestellung
 
Soll das so ähnlich aussehen wie bei Minecraft?
Es ist nicht nötig für jeden Block die Koordinaten zu speichern.
Du könntest ein 3 dimensionales int Array haben und dort nur jeweils den Typ des Blocks speichern.
 
wäre natürlich auch möglich
man definiert einen chunk einer bestimmten größe und gibt dann die reihenfolge vor ... so spart man sich die position und ballert dann nur die IDs in die datei
 

Zurück
Oben