Контекст
Old Lucas Arts (епоха ScummVM) вказує та натискає графічні пригодницькі ігри, що використовуються заздалегідь обчисленими маршрутами. Ось приблизний контур методики.
Крок 1
Підлогу в кожній кімнаті було розділено на те, що вони називали "прогулянкові коробки", які були майже еквівалентними вузлам у навігаційній сітці, але обмежені трапецієподібними формами. Наприклад:
______ _____ _________ _____
\ A | B | C | D \
\_____| | |_______\
|_____| |
|_________|
Крок 2
Автономний алгоритм (наприклад, Dijkstra або A *) обчислює найкоротший шлях між кожною парою вузлів і зберігає перший крок шляху у 2D матриці, індексується в кожному вимірі початковим і кінцевим вузлом, що використовується. Наприклад, використовуючи прогулянкові поля вище:
___ ___ ___ ___
| 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). Оскільки короткий звичайно буде достатньо великим для зберігання кожного запису в матриці, зі складною картою з 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 * рішення вже ідеально працювало ). І все-таки я залишився цікаво ...
Підсумок, чи ця методика досі актуальна в будь-якому сценарії?