Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.05.2013, 15:42

Algorithmus zum partiellen Auslesen einer Spielwelt

Huhu Zusammen,

bin recht neu in der Spieleentwicklung und probiere gerade allgemeine grundlegende Fragen zu klären. Daher mein Post.

Ich stehe vor der Problematik, dass ich eine Spielwelt habe, welche riesig sein kann. Dabei besteht die Welt aus einzelnen Pixeln (ähnlich wie bei Minecraft). Alle Pixel sind gleich große und stehen lückenlos aneinander und sind dreidimensional angeordnet, jedes Pixel kann unterschiedlich sein und muss daher einzeln gespeichert werden

Jetzt ist es so, dass die welt schon mal riesig werden kann. x > 10.000, y > 10.000, z > 10.000 evtl. noch viel größer. Das komplette einlesen der Spielwelt fällt somit weg.

Ich suche nach einem Ansatz zum bestimmten Bereiche auslesen. Damit soll bezweckt werden, dass ich rund um meinen Standpunkt bspw. nur 40 Pixel in jede Richtung auslese.

Mein erster Gedanke war, dass ich einfach eine Textdatei nehme und alle Pixel aufführe. Dabei müsste ich aber immer beim Bereich laden, die ganze Datei durch gehen und die Pixel zusammen suchen, da diese ja wahrscheinlich wild durcheinanderstehen (wegen dreidimensionalität). Das würde wahrscheinlich ein ewiges haken (auch wenn im Thread umgesetzt) verursachen, da das eine enormer Rechen Aufwand darstellt.

Zweiter Ansatz wäre eine Datenbank ... wobei ich mit dem Gedanken irgendwie fremdle, da ja andere Spiele auch keine Datenbank mit liefern sondern nur eine wild kodierte Datei wo alles drin gespeichert ist.

Direkt wäre meine Frage:
- gibt es dafür Algorithmen welche sich genau mit dieser Thematik beschäftigen?
- wie machen das die Spiele Hersteller?
- gibt es vielleicht sogar spezielle Dateien oder Controller, APIs oder ähnliches?

Ich sag schon mal ein ganz großes Danke schön
entschuldigt auch bitte meine Plattheit der Frage, wie gesagt ich stehe noch ganz am Anfang und die Überlegungen sind rein theoretischer Natur.

beste grüße
d :zombie:

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

2

29.05.2013, 15:53

Ich hoffe du nimmst es mir nicht übel wenn ich dir nur einen Link poste, aber eventuell klärt dies hier ein paar deiner Fragen:

Let's Make a Voxel Engine
:love: := Go;

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

3

29.05.2013, 16:14

Zerteil alles in 16x16x16 Bloecke und speichere die alle einzeln. Lade dann immer nur die noetigen Bloecke. Fertig.

4

29.05.2013, 18:24

aber wie?

ein block an sich ist ja eine selbstständige einheit. angenommen ich habe ein spielfeld von 1000 x 1000 x 1000 blöcke. dann wird es eine datei geben wo alle blöcke gespeichert sind. dann würde ich nur die aus der datei lesen, welche ich gerade benötige also die die um mich herum sind. müssten immer so 40 x 40 x 40 sein.

die frage ist ja jetzt wie ich das am glücksten mache, ohne immer wieder die ganze datei durch zu gehen.

ich verstehe nicht wirklich wie du das meinst, immer in 16 x 16 x 16 blöcke zuteilen?

Lares

1x Contest-Sieger

  • Private Nachricht senden

5

29.05.2013, 18:32

Ich weiß, das mag nicht direkt bei der Frage helfen, aber rede bitte nicht von Pixeln, wenn du Blöcke meinst. Das schafft nur Verwirrung.

Zur Frage:
Teile deine Welt in größere Abschnitte auf, nennen wir sie mal Sektoren. Dann könnte das in der Map-Datei so etwa aussehen:
Sektor 1
Block 1 x y z
Block 2 x y z
Block 3 x y z

Sektor 2
Block 4 x y z
Block 5 x y z
Block 6 x y z

....

Wäre zumindest mein Ansatz dabei. Gibt bestimmt noch bessere Lösungen,Optimierungen, etc.

6

29.05.2013, 20:42

ok dann blöcke ;)

Ok, also würde ich quasi überlegen wie groß ein Sektor ist, oder? und diesen dann aufteilen.

Angenommen ich mache einen Sektor immer mit 16 x 16 x 16 Blocks und speichere die einzelnen Sektoren untereinander.

Jetzt stellt sich mir die Frage, wie ich die am klügsten (nicht glücksten .. wie im letzten Post .. das ist ein fauxpas) zusammen sortiere. Wenn ich in einem Sektor stehe würde ich ja auch teile von anderen sektoren anzeigen und laden müssen. Diese würden ja aufgrund ihrer dreidimensionalität nicht direkt neben einander stehen und somit müsste ich ja doch wieder die ganze Datei lesen.

Ich dachte mir gerade, warum ich nicht einfach jeden Sektor einzeln speichere. So könnte ich die Sektoren in "x,y,z".datei speichern, und könnte gezielt die umliegenden Sektoren ansprechen und laden.

Mag engstirnig von mir sein, aber ich würde trotzdem gerne wissen, wie andere Hersteller das machen. Dass sie alle Daten zu einer Spielwelt in eine Datei pressen. Gibt es da spezielle Ressourcen sparende und schnelle Lesemethoden? Evtl. welche, dass ich in die Mitte der Datei einspringe und nicht immer am ersten Zeichen?

7

29.05.2013, 20:58

Du köntest die Frustum Culling Methode anwenden um festzustellen ob ein Block sichtbar ist oder nicht. Die Positionen Blöcke ist ja auch bekannt,bzw man könte sie berechnen, ohne das du die Blöcke geladen haben musst. Mit Frutum Culling kann man schon einiges raushohlen da effektiv auch nur die Objekte gerendert werden die sichtbar sind. Ich denke man könnte auch einen 2ten Threat machen der im Hintergrund die naheliegenden Objekte läd. Wen der Spieler später eine gewisse Distanz zu einen Block/Object hat kanst du es auch wieder löschen
https://en.wikipedia.org/wiki/Viewing_frustum

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »spitzohr« (29.05.2013, 21:25)


patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

8

29.05.2013, 21:08

Hier ist eine Wiki-Artikel über das Speicherformat, das Minecraft benutzt:
Region file format

simsusim

Frischling

Beiträge: 18

Wohnort: In einem kleinen Städtchen in Bayern

Beruf: Schüler(Gymnasium) 9. Klasse

  • Private Nachricht senden

9

30.05.2013, 17:42

Also Minecraft macht das meineswissens so, dass die welt in chunks mit je 16x16 blöcken aufgeteilt ist. Es werden dan immer das chunk, in dem du stehst und 1 chunks in jede richtung um dich herum gerendert. Das ganze siehst du auch wenn du läufst, wie sich die Welt immer blockweiße aufbaut. Der Rest wird dan in einer art Sky-Box angezeigt, die je nach sichtweite mehr oder weniger rendert für ihre Texturen. :D

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

10

31.05.2013, 01:07

In Minecraft kann man die Renderdistanz einstellen, d.h. abhängig davon werden mehr oder weniger Chunks um einen herum gerendert. Ein Chunk wird deshalb entweder gerendert oder eben nicht. Gespeichert werden sie in Gruppen, einer Region. Mit dem Minecraft Code Pack kannst du dir ja mal das ganze genauer anschauen.

Werbeanzeige