Vorwort
Dieses Tutorial befasst sich mit dem schlauen Nutzen von Binär. Ich werde euch zeigen wie man einen Array mit Daten füllt, der weniger (oder gleichviel, kommt drauf an) Speicher verbraucht als ein Buffer.
Was passiert?
Normalerweise kann man ja eine Zelle eines Arrays nur mit einer Zahl oder String füllen. z.B.
my_array[4,7] = 129;
Das Verbraucht, egal wie gross oder genau der Wert ist, 4 Bytes oder 32 Bits. In einem Buffer, wenn er einen Alignement von 1 hat, verbrauche das nur einen Byte oder 8 Bit.
Das ist nur ¼ des Speichers. Je kleiner der Wert (solange es nur Ganzzahlen sind) desto mehr effektiver Speicher wird verschwendet.
- Ein [12000] x [4000] Array braucht 183 Megabytes.
- Für Spiele die Zell-basiert sind und eine Menge von Informationen per Zelle speichern müssen wäre das absolut untragbar.
- 5 [12000] x [4000] Arrays brauchen fast 1 Gigabyte.
- Andere Daten müssen auch ihren Platz finden.
- Bei etwa 1.5 Gigabytes, kommt der out-of-memory Error!
Natürlich können Buffer genutzt werden, diese sind aber nicht so schnell.
Und auch die Handhabung 5 Buffers gleichzeitig kann schnell zu Verwirrungen führen.
Was kann man da tun?
Hier kommen die Binären Konstellationen ins Spiel. So muss man Dinge nicht mehr so sehen:
my_array[3,23] = 493;
sondern so:
my_array[3,23] = 1 1110 1101;
Wie man sieht ist die Obere Zahl als Binär geschrieben worden. Auf einen Blick ist erkennbar das die Zahl 7 Bits an Speicher verbraucht.
Eine Game Maker Zahl hat 32 Bits (von 0 bis 4'294'967'295 solange keine negativen vorkommen).
Also warum nicht einfach 5 verschiedene Zahlen auf 32 Bits aufteilen?
Man könnte das so darstellen:
Zahl1: 1011 0100 1100 1101 0101 0100 1111 0110 = 723
Zahl2: 1011 0100 1100 1101 0101 0100 1111 0110 = 53
Zahl3: 1011 0100 1100 1101 0101 0100 1111 0110 = 20
Zahl4: 1011 0100 1100 1101 0101 0100 1111 0110 = 15
Zahl5: 1011 0100 1100 1101 0101 0100 1111 0110 = 6
Schlüssel: 1011 0100 1100 1101 0101 0100 1111 0110 = 3'033'355'510
Was In diesen Infos steht kann man selbst interpretieren.
Die Zahlen können zwar nur eine bestimmte Grösse haben, jedoch sind sie alle in einem „Schlüssel“ gespeichert.
Dieser Schlüssel ist eine Riesenzahl und man kann unmöglich aus ihr herauslesen, welche Unter-informationen sich in ihr befinden.
Ja und wie bekommt man die Zahlen aus dem Schlüssel?
Um den Schlüssel zu entschlüsseln muss man eine Reihe von Bit-berechnungen anstellen:
Zahl1 muss ganz nach rechts rutschen damit sie nicht zu gross ist. Alle grauen 0 müssen weg.
Bei den Zahlen 2 bis 5 müssen zudem alle oberen Zahlen ebenfalls gelöscht werden:
wieder die grauen 0 wegshiften, dann um alle Bits auf der linken Seite zu löschen, einfach die Anzahl der Bits die man braucht (hier 8) auf 1 bitunden.
Das sähe so aus:
1011 0100 11 0011 0101 & 1111 1111 = 0000 0000 00 0011 0101;
was wiederum so aussieht:
1011 0100 11 0011 0101 & 0000 0000 0000 0000 0000 0000 1111 1111 = 0000 0000 00 0011 0101;
Alle Bits die einen &0 durchgehen sind automatisch 0.
Bei Zahl 5 kann man das Shiften auslassen und nur den & verwenden.
Beispiel in einem Script:
Wie stellt man einen Schlüssel zusammen?
Um den Schlüssel wieder zusammen zu stellen muss man die einzelnen Zahlen zurück-shiften und dann mit dem Bitoder | zusammenrechnen.
Auch das könnte in einem Script stehen.
Schlusswort
Soeben wurden aus fünf Arrays einer gemacht. Der Speicher hat sich von 0.9 Gigabytes auf 183 Megabytes reduziert.
Ein Array lässt sich auch gut in einen Buffer konvertieren damit man ihn speichern und laden kann.
Wahrscheinlich gibt’s da noch mehr Tricks oder Optimierungen. Könnt es ja hier mitteilen.
Dieses Tutorial befasst sich mit dem schlauen Nutzen von Binär. Ich werde euch zeigen wie man einen Array mit Daten füllt, der weniger (oder gleichviel, kommt drauf an) Speicher verbraucht als ein Buffer.
Was passiert?
Normalerweise kann man ja eine Zelle eines Arrays nur mit einer Zahl oder String füllen. z.B.
my_array[4,7] = 129;
Das Verbraucht, egal wie gross oder genau der Wert ist, 4 Bytes oder 32 Bits. In einem Buffer, wenn er einen Alignement von 1 hat, verbrauche das nur einen Byte oder 8 Bit.
Das ist nur ¼ des Speichers. Je kleiner der Wert (solange es nur Ganzzahlen sind) desto mehr effektiver Speicher wird verschwendet.
- Ein [12000] x [4000] Array braucht 183 Megabytes.
- Für Spiele die Zell-basiert sind und eine Menge von Informationen per Zelle speichern müssen wäre das absolut untragbar.
- 5 [12000] x [4000] Arrays brauchen fast 1 Gigabyte.
- Andere Daten müssen auch ihren Platz finden.
- Bei etwa 1.5 Gigabytes, kommt der out-of-memory Error!
Natürlich können Buffer genutzt werden, diese sind aber nicht so schnell.
Und auch die Handhabung 5 Buffers gleichzeitig kann schnell zu Verwirrungen führen.
Was kann man da tun?
Hier kommen die Binären Konstellationen ins Spiel. So muss man Dinge nicht mehr so sehen:
my_array[3,23] = 493;
sondern so:
my_array[3,23] = 1 1110 1101;
Wie man sieht ist die Obere Zahl als Binär geschrieben worden. Auf einen Blick ist erkennbar das die Zahl 7 Bits an Speicher verbraucht.
Eine Game Maker Zahl hat 32 Bits (von 0 bis 4'294'967'295 solange keine negativen vorkommen).
Also warum nicht einfach 5 verschiedene Zahlen auf 32 Bits aufteilen?
Man könnte das so darstellen:
Zahl1: 1011 0100 1100 1101 0101 0100 1111 0110 = 723
Zahl2: 1011 0100 1100 1101 0101 0100 1111 0110 = 53
Zahl3: 1011 0100 1100 1101 0101 0100 1111 0110 = 20
Zahl4: 1011 0100 1100 1101 0101 0100 1111 0110 = 15
Zahl5: 1011 0100 1100 1101 0101 0100 1111 0110 = 6
Schlüssel: 1011 0100 1100 1101 0101 0100 1111 0110 = 3'033'355'510
Was In diesen Infos steht kann man selbst interpretieren.
Die Zahlen können zwar nur eine bestimmte Grösse haben, jedoch sind sie alle in einem „Schlüssel“ gespeichert.
Dieser Schlüssel ist eine Riesenzahl und man kann unmöglich aus ihr herauslesen, welche Unter-informationen sich in ihr befinden.
Ja und wie bekommt man die Zahlen aus dem Schlüssel?
Um den Schlüssel zu entschlüsseln muss man eine Reihe von Bit-berechnungen anstellen:
Zahl1 muss ganz nach rechts rutschen damit sie nicht zu gross ist. Alle grauen 0 müssen weg.
Bei den Zahlen 2 bis 5 müssen zudem alle oberen Zahlen ebenfalls gelöscht werden:
wieder die grauen 0 wegshiften, dann um alle Bits auf der linken Seite zu löschen, einfach die Anzahl der Bits die man braucht (hier 8) auf 1 bitunden.
Das sähe so aus:
1011 0100 11 0011 0101 & 1111 1111 = 0000 0000 00 0011 0101;
was wiederum so aussieht:
1011 0100 11 0011 0101 & 0000 0000 0000 0000 0000 0000 1111 1111 = 0000 0000 00 0011 0101;
Alle Bits die einen &0 durchgehen sind automatisch 0.
Bei Zahl 5 kann man das Shiften auslassen und nur den & verwenden.
Beispiel in einem Script:
Wie stellt man einen Schlüssel zusammen?
Um den Schlüssel wieder zusammen zu stellen muss man die einzelnen Zahlen zurück-shiften und dann mit dem Bitoder | zusammenrechnen.
Auch das könnte in einem Script stehen.
Schlusswort
Soeben wurden aus fünf Arrays einer gemacht. Der Speicher hat sich von 0.9 Gigabytes auf 183 Megabytes reduziert.
Ein Array lässt sich auch gut in einen Buffer konvertieren damit man ihn speichern und laden kann.
Wahrscheinlich gibt’s da noch mehr Tricks oder Optimierungen. Könnt es ja hier mitteilen.