# Welche chunks im vorraus laden?



## AS3 (2. Sep 2012)

Hallo.
Ich habe eine Welt,
welche aus Chunks besteht.

Jetzt habe ich verschiedene Rechtecke und die Chunks in den Rechtecken sollten immer geladen sein.
Bei den rechtecken, handelt es sich um den Teil der Welt,
den verschiedene Spieler gerade sehen.







Das rote sind die 'views'.

Das klappt auch wunderbar.
Gerne würde ich jetzt chunks im voraus laden.
Und da weiß ich nicht, wie ich das ganze speichern soll und wie ich raus bekomme,
welche chunks ich schon mal laden soll und welche ich wider freigeben kann.
Momentan speicher ich die geladenen chunks in einer Hashmap, und entlade erst wider, wenn platz gebraucht wird.
Soll heißen ich setze mir eine maximal grenze von 5 geladenen chunks,
und wenn ich den 6. lade, gebe ich den der am weitesten von sämtlichen Views entfernt ist wider frei.

Also, zwei fragen:
1. Wie bekomme ich raus, welche chunks ich im voraus laden kann.
2. Wie sieht am besten meine interne Speicherstruktur aus.

Zu 1. ich habe mir gedacht, quasi 'kreise' um die views zu ziehen, und dann,  aus diesen kreisen immer 'random' ein paar chunks zu laden, oder wenn die Performance es zulässt (was sie sollte) immer die nächsten.(Ich überlege schon längere Zeit, und so etwas banales fällt mir natürlich erst beim schreiben ein. Ich als Grafikexperte habe jetzt ~10 Minuten gebraucht, die obere Skizze anzufertigen *grummel* aber eventuell kann mir jemand eine bessere Idee sagen. Ein objektives Auge ist immer gut )

AS3


----------



## Firephoenix (2. Sep 2012)

Sinnvoll wäre vermutlich der komplette View-Bereich (kein Spieler will eingefrorene Bereiche ohne irgendwas sehen) und einen Puffer-Bereich um die Views (z.b. noch ein zusätzlicher Chunk in jede Richtung). Hängt aber davon ab wie gut das für dein konkretes Spiel funktioniert und wie schnell du Chunks laden und freigeben kannst, bzw was in den Chunks passiert.

Wie du das intern speicherst ist dann dir überlassen, ich denke eine beste Lösung gibt es bei sowas nicht.
Denkbar wäre besagtes Hashset, oder auch eine Listenstruktur oder eine Verteilung pro Spieler oder vielleicht auch irgend eine Baumstruktur.

Gruß


----------



## sophismo (3. Sep 2012)

Minecraft macht 9x9 um den Spieler, es kommt halt sehr darauf an, wie groß deine Chunks sind und vor allem natürlich auch, wie schnell ein Spieler einen durchwandern kann..
Chunk ? Minecraft Wiki.

Allgemein kannst du alles von Nutzern erreichbares vorladen, oder? Was nicht erreichbar ist, brauchst du im Moment nicht. Unter der Annahme, dass Spieler nicht "springen" können, ist also jeder angrenzende Bereich interessant. - Manchmal sieht man den Wald vor Bäumen nicht, hoffe das hilft irgendwie.


----------



## AS3 (3. Sep 2012)

Hm,
da hatte ich wohl gestern ein Brett vorm Kopf.
Vielen Dank für eure Beiträge.
Jetzt ist das Brett weg 

AS3


----------



## Empire Phoenix (3. Sep 2012)

Ich empfehle noch WeakReferences / bzw deren hashmaps anzugucken. Warum chunks entladen solange noch ram da ist, kann ja durchaus sein das da nen spieler mal wieder reinwill?


----------



## Firephoenix (3. Sep 2012)

Empire Phoenix hat gesagt.:


> Ich empfehle noch WeakReferences / bzw deren hashmaps anzugucken. Warum chunks entladen solange noch ram da ist, kann ja durchaus sein das da nen spieler mal wieder reinwill?



Eine Alternative dazu wäre eine Art "überlauf" für Chunks einzurichten und Chunks vor dem Dereferenzieren erstmal dort "aufzuheben". Beim Laden schaut man dann einfach vorher nach ob der Chunk bereits im Überlauf vorhanden ist was entsprechend schnell gehen sollte.
Und durch die größe des Überlaufs begrenzt man die Anzahl nicht direkt mit dem Ram sondern kann das ganze schon auf Programmebene steuern.

Gruß


----------



## Empire Phoenix (3. Sep 2012)

Jo, das geht auch, hängt ganz davon ab ob chunks immer ähnlich viel ram verbrauchen, oder mehrere hundert megabyte unterschied haben können.


----------



## AS3 (3. Sep 2012)

WeakReferences.....

Man lernt immer dazu.
Allein deswegen hat sich die frage (trotz des Brettes ) gelohnt.

Allerdings, wird mein catch eher auf diese art implementiert:



Firephoenix hat gesagt.:


> ...




Viele(n) Grüße/Dank
As3


----------



## Marco13 (3. Sep 2012)

Hat mich ein bißchen an http://www.java-forum.org/codeschni...-asynccache-asynchron-nachladender-cache.html erinnert - aber passt wohl nicht ganz.

In Guava sind aber auch die Sachen, die man braucht, wenn man NICHT per Hand mit WeakReferences (bzw. in diesem Fall vielleicht auch *Soft*References) rumhantieren will: Eben der Cache, der auch Einträge "vergessen" kann - und das automatisch (!) macht, sobald der Speicher knapp wird, oder auf Basis anderer Kriterien. Aber man kann auch (eventuell eben aufbauend auf einen Guava Cache) die Verwaltung selbst in die Hand nehmen, um sicherzustellen, dass immer die benötigten Tiles geladen sind. Auf jeden Fall kann man mit den Guava Caches sehr elegant solche Sachen machen, die etliche hundert oder tausend Zeilen (und vieeel debugging  ) erfordern würden, wenn man sie selbst machen wollte.

Um rauszufinden, was demnächst geladen werden muss ... wüßte ich jetzt kaum etwas anderes, als die Bewegungsrichtung des Spielers zu betrachten, und schonmal die Tiles zu laden, die in dem "Kegel" liegen, der durch die aktuelle Bewegungsrichtung und leichte Abweichungen davon beschrieben wird.


----------



## AS3 (3. Sep 2012)

Ich habt mir sehr geholfen.
Wenn man jetzt zur laufzeit ein 'Bild' macht, sieht das ungefähr so aus:




_(4px = 1chunk)_

Das rote sind die aktuell gebrauchten chunks.
Das blaue die, welche im 'buffer' liege.
Die grünen die, welche im Catch liegen.
Ich werde den Catch aber noch verkleinern, denn so groß macht er keinen Sin.

(ich würde das ganze gerne veröffentlichen, aber... wie das so ist. Tut mir Leid)

AS3


----------

