Die App stürzt ab, wenn 1,5 GB erreicht sind.
Dies deutet stark darauf hin, dass Sie Ihre Kacheln nicht richtig darstellen, da dies bedeuten würde, dass jede Kachel eine Größe von ~ 80 Byte hat.
Was Sie verstehen müssen, ist, dass es eine Trennung zwischen dem Gameplay- Konzept einer Kachel und der visuellen Kachel geben muss , die der Benutzer sieht. Diese beiden Konzepte sind nicht dasselbe .
Nehmen wir zum Beispiel Terraria. Die kleinste Terraria-Welt nimmt 4200 x 1200 Kacheln auf, was 5 Millionen Kacheln entspricht. Wie viel Gedächtnis braucht es, um diese Welt darzustellen ?
Nun, jede Fliese hat eine Vordergrundebene, eine Hintergrundebene (die Hintergrundwände), eine "Drahtschicht", in die Drähte gehen, und eine "Möbelebene", in die Möbelstücke gehen. Wie viel Speicher nimmt jede Kachel ein? Auch hier sprechen wir nur konzeptionell, nicht visuell.
Eine Vordergrundkachel könnte leicht in einem nicht signierten Kurzschluss gespeichert werden. Es gibt nicht mehr als 65536 Vordergrundkacheltypen, daher macht es keinen Sinn, mehr Speicher als diesen zu verwenden. Die Hintergrundkacheln können sich leicht in einem vorzeichenlosen Byte befinden, da es weniger als 256 verschiedene Arten von Hintergrundkacheln gibt. Die Drahtschicht ist rein binär: Entweder enthält eine Kachel einen Draht oder nicht. Das ist also ein Bit pro Kachel. Und die Möbelschicht könnte wieder ein vorzeichenloses Byte sein, abhängig davon, wie viele verschiedene Möbelstücke es gibt.
Gesamtspeichergröße pro Kachel: 2 Bytes + 1 Byte + 1 Bit + 1 Byte: 4 Bytes + 1 Bit. Somit beträgt die Gesamtgröße für eine kleine Terraria-Karte 20790000 Byte oder ~ 20 MB. (Hinweis: Diese Berechnungen basieren auf Terraria 1.1. Das Spiel hat sich seitdem stark erweitert, aber selbst moderne Terraria könnten innerhalb von 8 Bytes pro Kachelort oder ~ 40 MB passen. Immer noch ziemlich erträglich).
Sie sollten diese Darstellung niemals als Arrays von C # -Klassen speichern. Sie sollten Arrays von ganzen Zahlen oder ähnlichem sein. AC # struct würde auch funktionieren.
Wenn es nun an der Zeit ist, einen Teil einer Karte zu zeichnen (beachten Sie die Betonung), muss Terraria diese konzeptionellen Kacheln in tatsächliche Kacheln umwandeln . Jede Kachel muss tatsächlich ein Vordergrundbild, ein Hintergrundbild, ein optionales Möbelbild und ein Drahtbild haben. Hier kommt XNA mit seinen verschiedenen Sprite-Blättern und dergleichen ins Spiel.
Sie müssen lediglich den sichtbaren Teil Ihrer konzeptionellen Karte in tatsächliche XNA-Sprite-Blattkacheln konvertieren. Sie sollten nicht versuchen, das Ganze auf einmal zu konvertieren . Jede Kachel, die Sie speichern, sollte nur ein Index sein, der besagt, dass "Ich bin Kacheltyp X", wobei X eine Ganzzahl ist. Sie verwenden diesen ganzzahligen Index, um das Sprite abzurufen, mit dem Sie es anzeigen. Und Sie verwenden die Sprite-Blätter von XNA, um dies schneller zu machen als nur einzelne Quads zu zeichnen.
Jetzt muss der sichtbare Bereich der Kacheln in verschiedene Teile aufgeteilt werden, damit Sie nicht ständig Sprite-Blätter erstellen, wenn sich die Kamera bewegt. Sie könnten also 64x64 Teile der Welt als Sprite-Blätter haben. Welche 64x64-Chunks der Welt von der aktuellen Kameraposition des Players aus sichtbar sind, sind die Chunks, die Sie zeichnen. Alle anderen Brocken haben nicht einmal Sprite-Blätter. Wenn ein Block vom Bildschirm fällt, werfen Sie das Blatt weg (Hinweis: Sie löschen es nicht wirklich; Sie behalten es bei sich und spezifizieren es erneut für einen neuen Block, der später sichtbar werden kann).
Ich möchte, dass die gesamte Karte zumindest auf der Server-App (und wenn möglich auf dem Client) verarbeitet wird.
Ihr Server muss die visuelle Darstellung von Kacheln nicht kennen oder sich nicht darum kümmern. Es muss sich nur um die konzeptionelle Darstellung kümmern. Der Benutzer fügt hier eine Kachel hinzu, sodass dieser Kachelindex geändert wird.