Contesto
I vecchi giochi di avventura grafica punta e clicca di Lucas Arts (ScummVM era) utilizzavano percorsi precompilati. Ecco uno schema generale della tecnica.
Passo 1
Il pavimento di ogni stanza era diviso in quelle che chiamavano "walk box", che erano praticamente equivalenti ai nodi in una rete di navigazione, ma limitate alle forme trapezoidali. Per esempio:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
Passo 2
Un algoritmo offline (ad es. Dijkstra o A *) calcolerebbe il percorso più breve tra ciascuna e ogni coppia di nodi e memorizzerebbe il primo passaggio del percorso in una matrice 2D, indicizzato in ogni dimensione dal nodo iniziale e finale utilizzato. Ad esempio utilizzando le walk box sopra:
___ ___ ___ ___
| 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
Come si può immaginare, i requisiti di memoria aumentano rapidamente all'aumentare del numero di nodi (N ^ 2). Dato che un corto sarebbe di solito abbastanza grande da memorizzare ogni voce nella matrice, con una mappa complessa di 300 nodi che comporterebbe la memorizzazione di un extra:
300^2 * sizeof(short) = 176 kilobytes
Passaggio 3
D'altra parte, calcolare il percorso più breve tra due nodi era estremamente veloce e banale, solo una serie di ricerche nella matrice. Qualcosa di simile a:
// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
Current = LookUp[Current, End]
Path.Add(Current)
ENDWHILE
Applicando questo semplice algoritmo per trovare il percorso più breve da C ad A, si ottiene:
1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit
Domanda
Sospetto che con il potente hardware di oggi, unito ai requisiti di memoria di farlo per ogni livello, tutti i vantaggi che questa tecnica aveva una volta sono ora superati semplicemente eseguendo un A * in fase di esecuzione.
Ho anche sentito che al giorno d'oggi le ricerche di memoria potrebbero anche essere più lente del calcolo generale, motivo per cui la creazione di tabelle di ricerca seno e coseno non è più così popolare.
Ma devo ammettere che non sono ancora troppo informato su queste questioni di efficienza hardware di basso livello, quindi sto cogliendo l'occasione per chiedere l'opinione di coloro che hanno più familiarità con l'argomento.
Sul mio motore avevo anche bisogno della possibilità di aggiungere e rimuovere dinamicamente nodi al grafico in fase di esecuzione ( vedi questo ) in modo che il percorso pre-calcolato rendesse solo le cose più complicate, quindi l'ho scartato (per non parlare del mio tempo di esecuzione Una soluzione * stava già funzionando perfettamente ). Tuttavia, sono rimasto a chiedermi ...
In conclusione, questa tecnica è ancora rilevante al giorno d'oggi in qualsiasi scenario?