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

02.09.2009, 22:28

Kleine Idee zum Thema: Terrain-Streaming

Hallo Spieleprogrammierer!

Nach ein paar Wochen Sommerferien und meinen Start auf einem Berufskollege möchte ich mich wieder meinem liebsten Hobby witmen, der Spieleprogrammierung ... :D

Nun sitze ich schon länger an dem Problem wie ich am besten riesige Landschaften in mein künftiges Spiel integrieren soll. Wärend dem Religionsunterricht habe ich mir ein paar neue Gedanken gemacht.

Erst einmal ein kleines Bild, damit man besser versteht was ich meine:

(Link)


Die Kästchen sollen Teile des Terrains darstellen, welche jeweils aus 33 * 33 Vertices bestehen. Die Rot gefülten Kästchen sind die Teile des Terrains die zwingend im Speicher vorliegen müssen. Die blauen Kästchen sind die Teile bei denen es warscheinlich ist das sie bald im Speicher sein müssen, und werden somit schonmal von der HDD gestreamt. Die Weißen Kästchen stellen die Teile da, welche nicht geladen sind und auch vorest nicht geladen werden müssen.

Als LOD Algo wird Geomipmapping benutzt, und wie die unterschiedlichen Detail Stufen aneinander liegen sieht man an der Helligkeit der Roten Kästchen. Um so heller, desto kleiner das Detail. Außerdem gibt es lediglich zwei Quadtrees in Terrain. Der erste Quadtree beinhaltet alle Roten Kästchen als Leafs. Dieser Quadtree wird eine feste anzahl an Leafs haben, und zwar genau so viele wie es auch maximal im Speicher vorliegende Teile geben darf. Warscheinlich werde ich eine Anzahl von 64 * 64 Leafs benutzen. Die maximale Sichtweite darf also auch nur so weit gehen wie der Quadtree es zu läßt. Wenn die Kamera sich in die nächsten Kästchen bewegt, werden alle Leafs um eine Stelle verschoben, und die zuvor gestreamten Kästchen werden einfach in den daraus folgenden leeren Kästchen verschoben. Der zweite Quadtree ist für die Exakte Kollision mit dem Terrain da. Jedes Kästchen benutzt ein und den selben Quadtree, von dem ein Leaf genau zwei Dreiecke beinhaltet. Frustum-Culling wird mit hilfe des ersten Quadtrees beschleunigt.

Egal wie groß das eigentliche Terrain ist, es wird immer ein und der selbe Speicher belegt sein. Es existiert kein Array welcher Zeiger auf alle Kästchen beinhaltet, sondern lediglich ein Array mit einer festen Größe, und zwar so groß wie die Anzahl der roten Kästchen. Ein möglicht kleines Format um die Höhendaten auf der HDD zu speichern kenne ich leider noch nicht.

Bevor ich mich morgen ins völlige Chaos stütze würde ich gern von euch wissen was ihr davon haltet. Ist es brauchbar oder sollte ich mir vieleicht doch nocheinmal völlig neue Gedanken machen. Oder gibt es vieleicht lediglich kleine Verbesserungen die man vornehmen könnte?

2

02.09.2009, 22:52

Joar hört sich doch schon mal gut an ;)

Ich würde vll sagen das du das Array nicht mit einer festen Größe machst, damit könnte man ja den Usern die Möglichkeit geben zb zusagen wie viel geladen werden soll, also halt abhängig von der Hardware.

Und sonst naja mit dem Speichern halt als nen png mit nem Format das nicht so viel pro Pixel an Speicher frisst^^

Zero

Viktor

Alter Hase

Beiträge: 533

Wohnort: Ludwigshafen

Beruf: Student

  • Private Nachricht senden

3

03.09.2009, 01:46

Ich weis zwar nicht, ob ich alles so richtig verstanden habe (bin jetzt nicht wirklich in die Materie eingelesen), aber mir scheint es so, dass der Ansatz mit 2*2 Kästchen nicht aufgeht (z.B. beim LoD).
Auf welcher Map befindet dich denn der Spieler? Oder werden die Maps je nach Spielerposition dynamisch geändert? Ich glaube, dass wäre aber nicht so schnell, wie vorbestimmte Mappositionen.

Wenn der Spieler sich z.B. auf der Map unten links befindet, dann ist die Distanz zur nächsten Stufe des LoD zur rechten Seite (eine ganze Map+ Länge bis zum rechten Maprand) sehr viel größer, als zur linken Seite (nur Länge bis zum linken Maprand). Daher wäre es doch sinnvoller, wenn die Farbzonen um die aktuelle Map herum gebildet werden. Also eine Map in der Mitte (auf der befindet sich der Spieler), dann 3*3-1-Maps um den Spieler herum, 5*5-(3*3-1), etc.

4

03.09.2009, 23:05

So meinst du das?


(Link)


Die unterschiedlichen Farben stellen jetzt die LOD Stufen da. Gelb gibt das mitlerste Feld an, welches die selbe LOD Stufe hat wie die Roten.

Du hast schon recht, es wäre besser wenn man die Map um die Teilmap aufbaut auf der sich der Spieler befindet. Schwer wird das ganze dann nur mit dem Quadtree, da dieser nun immer eine Länge und Breite einer ungeraden Zahl haben wird. Ich wollte versuchen es so hin zu bekommen das ein Node immer 4 Childs hat, oder halt ein Leaf ist.

Werde das ganze ersteinmal ohne Quadtree einbauen, und danach beschäftige ich mich damit!

Werbeanzeige