Frage

Ich bin ein Spiel für das Web zu entwickeln. Die Karte dieses Spiels wird ein Minimum von 2000km von 2000km sein. Ich möchte in der Lage sein, Höhe und Geländetyp auf einem bestimmten Ebene der Granularität zu kodieren - zum Beispiel 100 x 100 m.

Für eine 2000km von 2000km Karte Speichern dieser Informationen in 100m 2 Eimer 20000 von 20000 Elementen oder insgesamt 400 Millionen Datensätze in einer Datenbank bedeuten würde.

Gibt es eine andere Möglichkeit, diese Art von Informationen zu speichern?

Weitere Informationen

Die Karte selbst wird nicht immer in seiner Gesamtheit angezeigt werden. Die Anteile werden auf der Karte in einer rundenbasierten Art und Weise und die Spieler Feedback bewegt werden erhalten, wo sie sich befinden und was die Umgebung aussieht. Terrain wird Geschwindigkeit und das Verbot der Bewegung diktieren.

Ich glaube, ich bin versucht zu sagen, dass die Karte für das Spiel und nicht unbedingt für einen grafischen oder Anzeigezweck verwendet werden.

War es hilfreich?

Lösung

Ich würde es anders behandeln, durch Geländetyp und Elevation zu trennen.

  1. Geländetyp, nehme ich an, ändert sich nicht so schnell wie Höhe - es gibt wahrscheinlich Sektoren von der gleichen Art von Gelände, das als die niedrigste Ebene der Granularität über längere strecken. Ich würde diese Sektoren in Datenbankeinträge oder irgendeine Art von Hash-Tabelle, je nach Leistung, Speicher und andere Anforderungen abzubilden.

  2. Elevation Ich gehe davon würde halb contiuous, wie es allmählich zum größten Teil ändert. Ich würde versuchen, die Werte in Reihe von stetigen Funktionen (verschiedene Sätze zwischen den Teilen, die nicht, wie in plötzlichen Höhenänderung weiter) abzubilden. Für jeden Satz von Koordinaten, für die das Gelände der gleichen Höhe ist oder durch eine einfache Funktion beschrieben werden, müssen Sie nur den Bereich dieser Funktion deckt definieren. Dies sollte reduzieren viel die Menge an Informationen, die Sie aufnehmen müssen, um die Höhe an jedem Punkt im Gelände zu beschreiben.

Also im Grunde möchte ich die Karte in verschiedene Sektoren aufgliedern, die von (x, y) zusammensetzen reicht, einmal für Geländetyp und einmal für Geländehöhe und bauen für die jeweils eine Hash-Tabelle, die den entsprechenden Wert nach Bedarf zurückkehren kann.

Andere Tipps

Es hängt davon ab, wie Sie Ihr Terrain zu generieren. Zum Beispiel könnten Sie erzeugen sie prozedural alle (durch Interpolation von einer niedrigen Auflösung Gelände / Höhenkarte - gespeichert als zwei „Bitmaps“ - mit zufälliger Interpolation aus den xy-Koordinaten ausgesät, um dieses Gelände sicherzustellen, hat Morph nicht), und verwenden Sie minimale Speicher . Wenn Sie Bereiche des Geländes wollen, die vollständig definiert wurden, können Sie diese separat speichern und verwenden sie dann geeignet, wenn zufällig den Rest zu erzeugen.)

Wenn Sie vollständig definiert Gelände wollen, dann in eine Art von Kompression zu suchen brauchen Sie gehen / Technik Streaming nur Terrain zu ziehen sind Sie gerade interessiert an.

Wenn Sie die Art von Granularität wollen, die Sie suchen, dann gibt es keine offensichtliche Art und Weise tun.

Sie könnten versuchen, eine 2-dimensionale Wavelet-Transformation, aber das ist ziemlich komplex. So etwas wie ein Fourier-Transformation ganz gut tun würde. Außerdem würden Sie wahrscheinlich nicht gehen über das Gelände mit einem Ein-Rekord-per-Stück-of-Land Art und Weise zu speichern; macht es mehr Sinn, eine Art Datenbankfeld zu haben, die eine codierte Matrix speichern kann.

Ich denke, die übliche Lösung Ihre Domäne in „Kacheln“ von überschaubaren Größen bis zu brechen ist. Sie werden ein wenig Logik hinzufügen, müssen Sie die entsprechenden Kacheln zu einem bestimmten Zeitpunkt zu laden, aber nicht so schlecht.

Sie sollten nicht all diese Informationen sofort zugreifen müssen -. Selbst wenn jeder 100m2 Eimer ein einzelnes Pixel auf dem Bildschirm belegt, kein Schirm ich kenne 20k x 20k Pixel auf einmal zeigen könnte,

Auch würde ich nicht eine Datenbank verwenden - suche in Höhe Mapping -. Effektiv ein Schwarz-Weiß-Bild mit deren Pixelwerte repräsentieren Höhen

Viel Glück!

Das wird furchtbar viele Informationen sein, egal welche Art und Weise man es betrachtet. 400 Millionen Gitterzellen werden ihren Tribut fordern.

Ich sehe zwei Möglichkeiten, um diese geht. Erstens, da es dich um ein web-basiertes Spiel, könnten Sie in der Lage sein, einen Server mit einem anständig großen HDD zu erhalten und speichern Sie die 400M Datensätze in ihm so wie man es normalerweise. Oder eher eine Art von Ihrem eigenen Speichermechanismus für Effizienz schaffen. Dann würden Sie nur einen Weg ausdenken müssen, um effizient auf die Daten zugreifen, die unter Berücksichtigung der Tatsache, getan werden könnte, dass Sie mißtrauisch müssen sie alle auf einmal verwenden. ;)

Die andere Möglichkeit wäre eine Art von Kompression sein. Sie müssen vorsichtig sein mit diesem though. Die meisten out-of-the-box-Komprimierungsalgorithmen werden nicht zulassen, dass Sie eine beliebige Stelle im Stream dekomprimieren. Vielleicht ist Ihr Geländedaten hat einige Muster in ihm können Sie verwenden? Ich bezweifle es völlig zufällig sein wird. Wahrscheinlicher Ich sage voraus, große Flächen mit den gleichen Daten. Vielleicht können jene, die als solche codiert werden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top