Kontext
Alte Lucas Arts (ScummVM-Ära) zeigen und klicken Sie Grafik-Adventure-Spiele verwendet vorberechnete Wegfindung. Hier ist eine grobe Übersicht über die Technik.
Schritt 1
Der Boden in jedem Raum war in sogenannte "Walkboxen" unterteilt, die den Knoten in einem Navigationsnetz ziemlich gleichwertig waren, sich jedoch auf Trapezformen beschränkten. Z.B:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
Schritt 2
Ein Offline-Algorithmus (z. B. Dijkstra oder A *) berechnet den kürzesten Pfad zwischen jedem Knotenpaar und speichert den ersten Pfadschritt in einer 2D-Matrix, die in jeder Dimension durch den verwendeten Start- und Endknoten indiziert wird. ZB mit den oben stehenden Walkboxen:
___ ___ ___ ___
| A | B | C | D | <- Start Node
___|___|___|___|___|
| A | A | A | B | C | ---
|___|___|___|___|___| |
| B | B | B | B | C | |
|___|___|___|___|___| |-- Next node in shortest path
| C | B | C | C | C | | from Start to End
|___|___|___|___|___| |
| D | B | C | D | D | ---
|___|___|___|___|___|
^
|
End Node
Wie Sie sich vorstellen können, steigt der Speicherbedarf mit zunehmender Anzahl von Knoten (N ^ 2) schnell an. Da ein Short normalerweise groß genug ist, um jeden Eintrag in der Matrix zu speichern, führt eine komplexe Zuordnung von 300 Knoten dazu, dass ein zusätzlicher gespeichert wird:
300^2 * sizeof(short) = 176 kilobytes
Schritt 3
Andererseits war das Berechnen des kürzesten Pfades zwischen zwei Knoten extrem schnell und trivial, nur eine Reihe von Suchen in der Matrix. Etwas wie:
// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
Current = LookUp[Current, End]
Path.Add(Current)
ENDWHILE
Verwenden Sie diesen einfachen Algorithmus, um den kürzesten Weg von C nach A zu finden:
1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit
Frage
Ich vermute, dass mit der heutigen leistungsfähigen Hardware und den Speicheranforderungen für jedes Level alle Vorteile, die diese Technik einst hatte, durch einfaches Ausführen eines A * zur Laufzeit aufgewogen werden.
Ich habe auch gehört, dass die Speichersuche heutzutage möglicherweise sogar langsamer ist als die allgemeine Berechnung, weshalb das Erstellen von Sinus- und Cosinus-Nachschlagetabellen nicht mehr so beliebt ist.
Ich muss jedoch zugeben, dass ich noch nicht allzu gut mit diesen Fragen der niedrigen Hardwareeffizienz vertraut bin. Daher nutze ich diese Gelegenheit, um die Meinung derjenigen zu erfragen, die mit dem Thema besser vertraut sind.
Bei meiner Engine musste ich auch die Möglichkeit haben, zur Laufzeit Knoten dynamisch zum Diagramm hinzuzufügen und zu entfernen ( siehe dies ), damit die vorberechnete Route die Dinge nur komplizierter machte. Daher habe ich sie verschrottet (ganz zu schweigen von meiner Laufzeit). Eine * -Lösung lief bereits einwandfrei ). Trotzdem fragte ich mich ...
Fazit: Ist diese Technik heutzutage in jedem Szenario noch relevant?