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.10.2014, 19:12

Entgültiger Plan zur Erstellung des Semi-Dynamischen LOD-Procedural-Planet-Projekts

Hallo! Da dies nun eher ein feststehender Plan ist, den ich vorstellen möchte (bzw. gerne auch Meinungen und Anregungen dazu hören würde) mach ich einen neuen Thread auf. Ich stelle allerdings "nur" den groben Ablaufplan auf, da ich es noch nicht (vollständig) umgesetzt habe. Ich bin da eher jemand, der zunächst theoretisch an die Sache ran geht und sie durchdenkt, damit beim Programmieren selber keine Logik-Fallen auftauchen, und man zwischen Programmieren und unnötigen Nachdenken hin und her wechseln muss.

Also.
Ich habe zunächst einmal zwei Klassen:
Die SphereCreator Klasse
und die Planet Klasse

In der Theorie erstellt SphereCreator mehrere Listen. Es gibt für jede Detailstufe jeweils eine List für Vertices und eine für Indizes.
Sprich bei 6 Detailstufen sind es 6 IndexLists und 6 VertexLists.

Die Planet Klasse nimmt sich diese Lists und verarbeitet sie zum Planeten.
Zusätzlich überwacht sie das LOD

In der INIT-Phase (Lade-Phase):

SphereBuilder-Aufruf
Erstellt Quad-Tree für die Quadrate (Kooridinaten der Punkte)
Geht durch den Quad-Tree und sammelt die Vektoren für die benötigten Detail-Stufen.
Bildet zugehörige Index-Lists


Update-Phase:
Semi-Update (Wird nur benutzt, falls nötig)
Wenn Planet in Sichtweite und Planet Loaded = 0:
-Planet-Aufruf (Parameter Lists)
-Verändere VertexLists für Terrain
-Erstelle Buffer (Für jedes Face der MIN-LEVEL-Stufe eines)
-Für alle Detail-Stufen:
-Gehe durch die Liste der Indices für diese Stufe
-Sammle alle Vertices, auf die durch Indices verwiesen wird.
-Erstelle simples Indice-Array für dieses VertexArray
-Setze Planet Loaded = 1;
Sonst Wenn Planet nicht in Sichtweite:
-WENN Planet Loaded = 1;
--Befreie Verweis auf Planeten (Instanz wird nicht mehr benötigt)
--Planet Loaded = 0;
-SONST:
--Nichts

Dauerhaftes Update:
Wenn Planet Loaded = 1:
-Ermittle benötigte Detail-Stufe pro Face
-Lade den Buffer für dieses Face mit dem benötigten Array.


Vorteile:
Durch das nur einmalige erstellen der Sphere wird unnötiges erstellen von Quad-Trees und das Durchlaufen dieser vermieden.
Durch das Laden und Entladen der Planeten-Verweise wird den langen Lade-Zeiten (die sonst gigantisch werden) entgegengewirkt,
indem nur die Planeten in Sichtweite geladen werden (sonst müssten initial alle Planeten geladen und überprüft werden).
Das Entladen dient der Speicherverwaltung. Ansonsten wäre der Speicher nach dem durchfliegen ziemlich überfüllt.

Durch das Verteilen der Lists auf einzelne Buffer besteht die Möglichkeit größere Detail-Stufen zu nutzen, da diese die Buffer durch die
Anzahl der Vertices nicht (so schnell) überladen.
Ferner wird der Eindruck der Dynamik gewährleistet, da mindestens nur die Größe eines Faces auf Min-Detail-Stufe genutzt wird.
Das heißt, sollte man nahe an dem Planeten dran sein, wird nur ein kleiner Ausschnitt hoch detailliert. Somit entfallen lange Render-Zeiten. (Wichtig für
Effekt-Berechnung)

Zum Schluss wird die Spielgeschwindigkeit positiv beeinflusst, da das meiste an Rechen-Arbeit vorher geschieht.
Es ist also eine Balance zwischen Lade-Zeit und FPS.