World
Simulation
Level of Detail AI
Was vorher zu sagen ist:
|
|
|
|
Nur wenig praktische Erfahrungen und
Anwendungen existieren. |
|
Trotzdem interessante Ideen! |
|
Grundlagenforschung von: |
|
Stephen Chenney |
|
(Simulation Level of Detail) |
|
David O' Brien, Susan Fisher und Ming
C. Lin |
|
(Simplification of Particle System
Dynamics) |
Worum geht es überhaupt?
|
|
|
|
Spielumgebungen wachsen |
|
immer mehr simulierte Spielobjekte |
|
CPU und Speicher können nicht mit der
Entwicklung der Grafik Schritt halten |
|
speziell auf Konsolen |
|
Trotzdem: Ansprechende Welten
überzeugend zum Leben erwecken |
Ein Beispiel: Landschaft
|
|
|
|
Überzeugende Landschaft könnte bieten: |
|
Pflanzen soviele die Grafiktechnologie
erlaubt |
|
Tiere die in der Landschaft leben |
|
Menschen die Tiere jagen |
|
Aliens die die Menschen jagen |
Landschaft – das Problem
|
|
|
|
Kleiner Ausschnitt kein Problem |
|
schon in vielen Spielen mehr oder
weniger erfolgreich versucht |
|
viele kleine Level |
|
Nicht einfach lösbar: |
|
realistische Wegstrecken |
|
große Spieldauer in derselben Welt |
|
Auswirkungen entfernter Ereignisse |
Erste Idee
|
|
|
Nur sichtbare Grafik wird angezeigt
– Großteil der Welt braucht nicht
simuliert werden! |
|
Diese Lösung haben Spiele schon immer
benutzt. |
Beispiel: Midtown Madness
|
|
|
|
Simulation Bubble: |
|
Grenze an der Objekte gelöscht werden
oder abprallen |
|
Grenze bewegt sich immer mit dem
Spieler |
|
|
|
Funktioniert nicht! |
|
auffällig, wenn zu klein |
|
zuviel Rechenzeit, wenn größer |
|
Entwicklungen der nicht sichtbaren Welt
können keinen Einfluss auf das Spiel haben |
Bessere Idee
|
|
|
|
Lösung aus der Grafik: Level of Detail |
|
|
|
Welche Ereignisse beeinflussen das
Spielerlebnis wirklich? |
|
Angenäherte Simulation: |
|
Details können zusammengefasst werden |
|
Nur direkt im Sichtnahbereich des
Spielers wird wirklich korrekt simuliert |
Simulations Level of
Detail
|
|
|
|
Beispiele: |
|
keine Interaktion von Objekten, wo
nicht nötig |
|
Ereignisse nur statistisch korrekt |
|
Lineare Bewegungen in der Entfernung |
|
|
|
Reicht für einen überzeugenden Eindruck
für den Spieler aus: |
|
Erinnerungen an exakte Details hat kein
Spieler |
Problem!
|
|
|
Kein unwichtiges Objekt soll berechnet
werden - wie findet man dann heraus, ob ein Objekt inzwischen wichtig für den
Spieler geworden ist? |
Betrachtung wichtiger
Events
|
|
|
|
Keine Simulation, aber wichtige Events
für Objekte betrachten - dann bei Eintritt genauer simulieren: |
|
Bewegtes Objekt übertritt eine Grenze
und wird wichtig für den Spieler |
|
Umschaltung der Simulationsgenauigkeit |
|
Events speichern und bearbeiten für
alle wichtigen Objekte im Spiel. |
Beispiele
|
|
|
Schmetterlinge in einer Landschaft |
|
Fahrzeug aus gegnerischer Stadt |
Vereinfachte Simulation
(Proxy)
|
|
|
|
Events werden vorhergesagt |
|
Kein gültiger Status mehr für Objekte
zwischen Events! |
|
Queue zum Speichern der Events |
|
sortiert nach Eintrittszeit |
|
Nur erster Eintrag der Queue wird
jeweils bearbeitet. |
Genauigkeit?
|
|
|
|
Alle wichtigen Events erkannt? Dann
gutes Ergebnis auch ohne Simulation: |
|
Schwierigkeit für jedes Spiel neu zu
lösen! |
|
Lösungen nur für einfache Systeme
(Partikel) |
|
Richtige Dinge sollen zur richtigen
Zeit am richtigen Ort passieren. |
|
WAS ist für den Eindruck des Spielers
entscheidend? |
|
Reisezeiten, Zustände,
Dichtenentwicklung |
Vorhersagen
|
|
|
|
|
Lineare Bewegungen: |
|
trivial |
|
Interaktion von Objekten: |
|
Vorhersage des frühestmöglichen
Eintritts und Neueintragung nach Betrachtung der Umstände. |
|
Ausserdem eine statistische
Korrektheit: |
|
durchschnittliche Geschwindigkeit
modifiziert mit Objektdichte im aktuellen Gebiet |
|
Einberechnung der Umstände (Terrain
Reasoning) |
|
Pfade im vorraus berechnen und als
Verzögerung einfliessen lassen |
Sichtbarkeitsbestimmung
|
|
|
|
Objekte hängen an Zellen |
|
Einteilung der Spielwelt in Quadrate,
Tree, … |
|
Sichtbarkeit der Zelle bestimmt
Sichtbarkeit des Objektes |
|
Eintritts- und Austritts-Events: |
|
stellen Zuordnung nicht simulierter
Objekte zu korrekten Zellen sicher |
Bewegte Punkte
|
|
|
|
Event |
|
Zellenwechsel |
|
Vorhersage |
|
nächster Zellenwechsels |
|
Bearbeitung des Events |
|
Zellenwechsel und neue Vorhersage |
|
Abfrage des nächsten Events |
|
Prüfung auf Eintritt, Rückgabe und
Löschen aus der Queue |
Implementierung
|
|
|
Init() |
|
{ |
|
for(all objects) |
|
{ |
|
event.object = cur_object |
|
event.time =
PredictNextEvent(cur_object) |
|
InsertQueue(event) |
|
} |
|
} |
|
OnIdle |
|
{ |
|
event = GetQueueNextEvent() |
|
if(event) |
|
ProcessEvent(event) |
|
} |
Implementierung
|
|
|
ProcessEvent(event) |
|
{ |
|
cell = HasEntered(event.object) |
|
if(cell) |
|
{ |
|
event.time =
PredictNextEvent(event.object) |
|
InsertQueue(event) |
|
} |
|
else |
|
{ |
|
InsertToCell(cell, event.object) |
|
event.time =
PredictNextEvent(event.object) |
|
InsertQueue(event) |
|
} |
|
} |
Zustände
|
|
|
Objekte die wieder in das Sichtfeld
kommen sollten im erwarteten Zustand sein! |
|
Komplett neue Objekte (nicht einmal
mehr mit Proxy simuliert) müssen mit funktionierenden Zuständen in das System
eintreten! |
|
Wichtig: |
|
Neuer Zustand muss nicht korrekt sein,
sondern nur so wirken! |
Zufällige Generierung
|
|
|
|
|
|
Mit Random Seed nach Position der
Simulationszelle: |
|
nur für unwichtige
Details geeignet |
|
z.B. kleine Pflanzen, Insekten |
Auslagern/Abspeichern
|
|
|
|
|
letzter bekannter Zustand wurde
(komprimiert) gespeichert und wird wiederbelebt |
|
Zeitdifferenz wird nachsimuliert: |
|
nur bei einfacher Nachsimulation |
|
durch zufällige Verschiebung |
|
oder leichte Veränderungen der Zustände |
Nutzung von Ähnlichkeiten
|
|
|
|
Vorhandene, ähnliche Objekte benutzen
und kombinieren |
|
Extremfall: Kopie einer kompletten
Zelle |
|
Vorhandene Objekte müssen schnell
auffind- und abfragbar sein! |
Zusammenfassung: Schritte
zur Proxy-Simulation
|
|
|
Welche Verhaltensweisen sollen auch im
Proxy beibehalten werden? |
|
Wie müssen die Bereichswechselevents
gewählt sein so dass 1. funktioniert? |
|
Welche Statusvariablen benötigen die
Objekte im Proxy? |
|
Wie wird der Status von Objekten die
sichtbar werden wieder hergestellt? |
|
Testen, Ändern, Testen |
Verbesserungsansätze
|
|
|
|
Immer noch zuviel Aufwand bei vielen
Objekten in einer Zelle! |
|
Beispiel: |
|
Partikelähnliche Verhalten |
|
Objekte nötig um Inkonsistenzen zu
vermeiden |
Ähnlichkeiten nutzen
|
|
|
|
Lösung für Objekte mit ähnlichem
Verhalten (Partikel) existiert: |
|
Ähnliche Objekte in räumlicher Nähe
werden zu Clustern zusammengefasst und wie ein Objekt simuliert. |
|
Je nach Entfernung vom Spieler oder
seinem Blickzentrum werden verschiedene Clustergrößen erzeugt. |
|
Performance steigt um ein Vielfaches |
SLOD-Tree
|
|
|
|
|
Sortierung der Objekte in
kd-Tree: |
|
angelegt nach Physik- oder
Simulationseigenschaften |
|
Blatt "simulation level of
detail" (SLOD): |
|
resultiert aus einsortierten Objekten |
|
wirkt gleich auf alle |
Einbindung in Proxy
|
|
|
|
Zellen ergänzt durch kd-Tree wo nötig |
|
Speicherung verschiedener Objektarten: |
|
mehrere Trees pro Zelle. |
|
Änderungen am Tree nur bei
Zellenwechseln |
|
kompletter Cluster wechselt in
benachbarte Zelle |
|
wird eventuell neu gesplittet |
Regions of Interest
|
|
|
|
|
Wichtigkeit von Bereichen: |
|
Über Zellen und SLOD-Tree liegen ROIs: |
|
Wichtigkeit aller Objekte im Cluster
für die Simulation |
|
Angabe von maximaler Clustergröße (Raum
und Dichte) |
|
Fassen nach Vorgaben möglichst passend
Objekte zu Clustern zusammen |
ROIs
|
|
|
|
|
Können schnell auf Veränderungen
angepasst werden |
|
Cluster sortieren sich in folgenden
Simulationsschritten automatisch neu |
|
Beispiele: |
|
Kamera-ROI bei Bewegungen des Spielers |
|
Spielevent-ROI bei wichtigen
Ereignissen |
|
Hintergrund ROI hat niedrigste
Priorität |
Drei ROIs
Updates
|
|
|
|
Neue Objekte vom ROI aus einfügen |
|
Beachtung der ROI-Prioritäten |
|
top-down in Zellen und Trees
einsortieren |
|
Clusterwechsel beim Parent |
|
bottom-up |
|
eventuell ROI-Wechsel |
Berechnung
|
|
|
|
|
Pro Cluster eine Standardsimulation: |
|
mittlere Position |
|
mittlere Geschwindigkeit |
|
Je nach Objektart Gewichtung z.B. nach: |
|
Masse |
|
Ausdehung |
|
Ergebnis gilt für alle Objekte des
Clusters |
Zusammenfassung
|
|
|
Grundidee: |
|
Nur was für den Spieler wichtig ist,
braucht berechnet zu werden! |
|
Erreichte Ziele: |
|
Vorhersage und angenäherte Berechnung
ermöglichen weit größere Spielwelten |
|
Besonders für die Dynamik von
Partikelsystemen existiert eine Level of Detail Lösung mit großen
Performancegewinnen. |
Probleme
|
|
|
Auch diese Lösung verschiebt das
Problem nur ein Stück weiter. |
|
Bisher keine generelle Lösung gefunden
- für jedes Spiel müss alle wichtigen Events selber gefunden werden. |
Weitere Anwendung:
Netzwerk
|
|
|
Netzwerkspiele in großen Umgebungen
können mit den hier beschriebenen Methoden unnötigen Traffic vermeiden. |
|
Daten müssen nur noch bei neuen Events
und bei Objekten im Sichtbereich (bzw. voll simulierten Bereich) übertragen
werden. |
Weiterführende Quellen
|
|
|
Joe Adzima, "Using AI to bring
Open City Racing to Life", Game Developer Magazine, Dec 2000, pp 26-31 |
|
Stephen Chenney, "Simulation Level
of Detail", GDC 2001 Proceedings, pp 177-191 http://www.cs.wisc.edu/~schenney |
|
David O' Brien, Susan Fisher, Ming C.
Lin, "Automatic Simplification of Particle System Dynamics", http://www.cs.unc.edu/~geom/SLOD |
Vielen Dank!