контекст
Old Lucas Arts (эпоха ScummVM) указывает и щелкает графические приключенческие игры, использующие предварительно вычисленные пути. Вот примерный план техники.
Шаг 1
Пол в каждой комнате был разделен на то, что они называли «прогулочными коробками», которые были в значительной степени эквивалентны узлам в навигационной сетке, но ограничены трапециевидными формами. Например:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
Шаг 2
Автономный алгоритм (например, Dijkstra или A *) будет вычислять кратчайший путь между каждой парой узлов и сохранять первый шаг пути в двумерной матрице, индексируемой в каждом измерении по используемому начальному и конечному узлу. Например, используя прогулочные коробки выше:
___ ___ ___ ___
| 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
Как вы можете догадаться, требования к памяти быстро увеличиваются с увеличением количества узлов (N ^ 2). Поскольку short обычно бывает достаточно большим, чтобы хранить каждую запись в матрице, со сложной картой из 300 узлов, что приведет к сохранению дополнительного:
300^2 * sizeof(short) = 176 kilobytes
Шаг 3
С другой стороны, вычисление кратчайшего пути между двумя узлами было чрезвычайно быстрым и тривиальным, всего лишь серия поисков в матрице. Что-то вроде:
// Find shortest path from Start to End
Path = {Start}
Current = Start
WHILE Current != End
Current = LookUp[Current, End]
Path.Add(Current)
ENDWHILE
Применение этого простого алгоритма для нахождения кратчайшего пути от C до A возвращает:
1) Path = { C }, Current = C
2) Path = { C, B }, Current = B
3) Path = { C, B, A }, Current = A, Exit
Вопрос
Я подозреваю, что с сегодняшним мощным аппаратным обеспечением в сочетании с требованиями к памяти для выполнения этого для каждого уровня любые преимущества, которые когда-то имели этот метод, теперь перевешиваются простым выполнением A * во время выполнения.
Я также слышал, что в настоящее время поиск в памяти может быть даже медленнее, чем общие вычисления, поэтому создание таблиц поиска синусов и косинусов уже не так популярно.
Но я должен признать, что я еще не слишком разбираюсь в этих вопросах низкой эффективности аппаратного обеспечения, поэтому я пользуюсь этой возможностью, чтобы спросить мнение тех, кто более знаком с предметом.
На моем движке мне также требовалась возможность динамически добавлять и удалять узлы на графике во время выполнения ( см. Это ), поэтому предварительно вычисленный маршрут только усложнил ситуацию, поэтому я удалил его (не говоря уже о том, что мое решение A * во время выполнения уже отлично работало) ). Тем не менее, мне было интересно ...
Итог, эта техника все еще актуальна в настоящее время в любом сценарии?