Ich wollte gerne mal fragen, wie OpenWorld realisiert/geladen/gerendert werden. Bei meinen (großen) Levels lade ich 1000x1000 Einheiten an Objekten (anfangs). Wenn der Spieler den nächsten Abschnitt sehen kann, erstelle ich ein Thread, lade die Daten und rendere sie noch dazu. Später lösche ich die Anfangsobjekte, wenn man sie nicht mehr sieht. Das ganze funktioniert ganz gut, aber gibt es eine bessere Möglichkeit?
Genau, das Buzzword dafür heißt 'Resource Streaming'. Die Idee dahinter scheinst du ja bereits umgesetzt zu haben. Es wird einer Liste von zu streamenden Resourcen erstellt und diese im Hintergrund nachgeladen/erstellt. Anschließend werden die aktuellen Resourcen gerendert. Die Kunst dabei ist die richtigen Resourcen auszuwählen um eine visuelles Feedback des Streaming Systems zu vermeiden. In vielen Spielen kann man ja beobachten wie (z.B.) Texturmips oder LOD Stufen von Meshes aufpoppen, genau an dieser Stelle funktioniert das Streaming System nicht optimal. Rage ist da beispielsweise so ein Kandidat. Andererseits ist es natürlich auch wichtig nicht zu viel zu laden.
Dafür gibt es verschiedene Ansätze die sich, je nach Kontext, mehr oder weniger eignen. Hier mal eine (kleine) Auswahl davon: Viele Spiele benutzen sogenannte
Air-Lock Regionen, also stellen an denen das Laden weiterer Regionen angestoßen wird und aus denen man erst raus kommt wenn alle benötigten Resourcen geladen wurden. Im Grund sind das also verbesserte Ladebildschirme, wo der Spiele (z.B.) hinter einer Tür herumlaufen kann bis die Daten nachgeladen wurden.
Ein anderer Ansatz ist es, das Level Regionen zu unterteilen und das Laden der Resourcen so früh zu beginnen, dass alle Resourcen geladen wurden, bevor der Spieler das Ende der aktuellen Region erreicht. Der Ansatz kann mehdimensional umgesetzt werden, beispielsweise kann das Level in ein (uniformes) Grid unterteilt werden und alle Zellen rund um den Spieler geladen werden.
Daneben gibt es häufig Stellen die optimiert werden können (müssen). Beispielsweise ist Bandbreite ein großes Thema (vor allem auf DVD/BD) oder Zugriffszeiten. In vielen Fällen lassen sich Ressourcen so hinterlegen, dass z.B. teure Dateioperationen (Öffnen, Suchen) vermieden werden können. Oder Daten können von DVD auf Festplatte gecached werden. Hier mal einige Ideen:
- Daten komprimieren
- Daten ordnen um seeks zu vermeiden
- Daten in ein Archive packen
- Resourcen auf HDD cachen
- Resourcen im RAM cachen (nur entladen wenn cache voll)
- Resourcen poolen um teure Allokation zu vermeiden
- ...