Contexto
Los viejos juegos de aventuras gráficas de Lucas Arts (era ScummVM) de apuntar y hacer clic utilizaban precalculación de rutas. Aquí hay un bosquejo de la técnica.
Paso 1
El piso de cada habitación estaba dividido en lo que llamaron "cajas de paseo", que eran más o menos equivalentes a los nodos en una malla de navegación, pero limitado a las formas trapezoidales. P.ej:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
Paso 2
Un algoritmo fuera de línea (por ejemplo, Dijkstra o A *) calcularía la ruta más corta entre cada par de nodos y almacenaría el primer paso de la ruta en una matriz 2D, indexada en cada dimensión por el nodo inicial y final utilizado. Por ejemplo, usando los cuadros de caminata de arriba:
___ ___ ___ ___
| 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
Como puede suponer, los requisitos de memoria aumentan rápidamente a medida que aumenta el número de nodos (N ^ 2). Dado que un corto generalmente sería lo suficientemente grande como para almacenar cada entrada en la matriz, con un mapa complejo de 300 nodos que resultaría en el almacenamiento de un extra:
300^2 * sizeof(short) = 176 kilobytes
Paso 3
Por otro lado, calcular la ruta más corta entre dos nodos fue extremadamente rápido y trivial, solo una serie de búsquedas en la matriz. Algo como:
// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
Current = LookUp[Current, End]
Path.Add(Current)
ENDWHILE
Aplicando este algoritmo simple para encontrar la ruta más corta de C a A devuelve:
1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit
Pregunta
Sospecho que con el potente hardware de hoy, junto con los requisitos de memoria para hacer esto en todos los niveles, cualquier beneficio que alguna vez tuvo esta técnica ahora se ve superado simplemente al realizar una A * en tiempo de ejecución.
También he oído que hoy en día las búsquedas de memoria pueden ser incluso más lentas que el cálculo general, por lo que crear tablas de búsqueda de seno y coseno ya no es tan popular.
Pero debo admitir que todavía no conozco demasiado sobre estos asuntos de eficiencia de hardware de bajo nivel, así que aprovecho esta oportunidad para pedir la opinión de aquellos más familiarizados con el tema.
En mi motor también necesitaba la capacidad de agregar y eliminar dinámicamente nodos al gráfico en tiempo de ejecución ( vea esto ), por lo que la ruta precalculada solo hizo las cosas más complicadas, así que lo descarté (sin mencionar que mi solución de tiempo de ejecución A * ya estaba funcionando perfectamente ) Aún así, me quedé preguntándome ...
En pocas palabras, ¿esta técnica sigue siendo relevante hoy en día en algún escenario?