Hab mal wieder ein Problem beim Speichern. Es geht darum 3 Arrays zu speichern mit der größe von 600x600. Der Array beinhaltet pro Einheit ein byte also eine Zahl zwischen 0 und 255.
Aber die endgröße ist ziemlich Groß und dauert sehr lange zum speichern/laden. Deswegen wollte ich eine Funktion schreiben die die Datein komprimiert Abspeichert und Ladet. Das funktionierte halbwegs ich konnte die Datei um 1/8 Kompriemieren also von 1080 kb auf 135 kb. Das geht auch um einiges schneller. Jetzt bekomme ich aber ein Problem die komprimierte Datei wieder zu Laden. Ich bekomme dann den Fehler: Error reading byte.
Jetzt verrate ich euch wie ich die Datei kompriemiere. Es geht den Array durch und wenn es eine Annreihung von gleichen Bytes findet so schreibt er in die Datei die Reihen länge und die Zahl.
Zum Speichern:
Spoiler anzeigen
Alles anzeigen
Zum Laden:
Spoiler anzeigen
Alles anzeigen
Nach dem Fehler zu beurteilen, liest er beim Laden mehr Bytes als er sollte, aber einen richtigen Fehler kann ich nicht finden.
Wenn jemand sogar noch eine bessere Methode zum komprimierten Speichern hat der kann es mir ruhig sagen.
Aber die endgröße ist ziemlich Groß und dauert sehr lange zum speichern/laden. Deswegen wollte ich eine Funktion schreiben die die Datein komprimiert Abspeichert und Ladet. Das funktionierte halbwegs ich konnte die Datei um 1/8 Kompriemieren also von 1080 kb auf 135 kb. Das geht auch um einiges schneller. Jetzt bekomme ich aber ein Problem die komprimierte Datei wieder zu Laden. Ich bekomme dann den Fehler: Error reading byte.
Jetzt verrate ich euch wie ich die Datei kompriemiere. Es geht den Array durch und wenn es eine Annreihung von gleichen Bytes findet so schreibt er in die Datei die Reihen länge und die Zahl.
Zum Speichern:
GML-Quellcode
- for(iy=0;iy<=600;iy+=1)
- {
- ix = 0
- while(ix<600)
- {
- lenght = 0
- ArtO = weltA[ix,iy]
- for(lenght = 0; lenght <= 255; lenght += 1)
- {
- ArtN = weltA[ix+lenght,iy]
- if(ArtN != ArtO or ix+lenght >= 600)
- break;
- ArtO = ArtN
- }
- file_bin_write_byte(file,weltA[ix,iy])
- file_bin_write_byte(file,lenght)
- ix += lenght
- }
- ix = 0
- while(ix<600)
- {
- lenght = 0
- ArtO = weltB[ix,iy]
- for(lenght = 0; lenght <= 255; lenght += 1)
- {
- ArtN = weltB[ix+lenght,iy]
- if(ArtN != ArtO or ix+lenght >= 600)
- break;
- ArtO = ArtN
- }
- file_bin_write_byte(file,weltB[ix,iy])
- file_bin_write_byte(file,lenght)
- ix += lenght
- }
- ix = 0
- while(ix<600)
- {
- lenght = 0
- ArtO = weltC[ix,iy]
- for(lenght = 0; lenght <= 255; lenght += 1)
- {
- ArtN = weltC[ix+lenght,iy]
- if(ArtN != ArtO or ix+lenght >= 600)
- break;
- ArtO = ArtN
- }
- file_bin_write_byte(file,weltC[ix,iy])
- file_bin_write_byte(file,lenght)
- ix += lenght
- }
- }
Zum Laden:
GML-Quellcode
- for(iy=0;iy<=600;iy+=1)
- {
- ix=0
- while(ix<600)
- {
- Art = file_bin_read_byte(file)
- Laenge = file_bin_read_byte(file)
- for(pos=ix;pos<=ix+Laenge;pos+=1)
- {
- weltA[pos,iy] = Art
- }
- ix+=Laenge
- }
- ix=0
- while(ix<600)
- {
- Art = file_bin_read_byte(file)
- Laenge = file_bin_read_byte(file)
- for(pos=ix;pos<=ix+Laenge;pos+=1)
- {
- weltB[pos,iy] = Art
- }
- ix+=Laenge
- }
- ix=0
- while(ix<600)
- {
- Art = file_bin_read_byte(file)
- Laenge = file_bin_read_byte(file)
- for(pos=ix;pos<=ix+Laenge;pos+=1)
- {
- weltC[pos,iy] = Art
- }
- ix+=Laenge
- }
- }
Nach dem Fehler zu beurteilen, liest er beim Laden mehr Bytes als er sollte, aber einen richtigen Fehler kann ich nicht finden.
Wenn jemand sogar noch eine bessere Methode zum komprimierten Speichern hat der kann es mir ruhig sagen.