ИИ и навигация в играх.
Козанов Тимур
Проблемы, решения, оптимизация под мобильные платформы.
Double Dice Games
Содержание
1. Управление сущностями.2. Топология пространства.3. Поиск пути.4. Навигация.
1. Учимся применять на практике.2. Оптимизация для мобильных платформ.
Подробно:
Коротко:
Управление сущностями.1Машина cостояний
Одно состояние=
один обработчик
Дерево поведенияОдно действие
= один обработчик
Плохой способСквозная логика
Гибридный способОптимальный
вариант
Дерево поведенияBehavior tree
Подробнее:http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php
Машина состоянийState Machine, Конечный автомат
Подробнее:https://gamedevelopment.tutsplus.com/tutorials/finite-state-machines-theory-and-implementation--gamedev-11867
Топология пространства(построение графа)2
GridСетка с квадратными ячейками
Hexagonal GridСетка с шестиугольными ячейками
NavmeshСетка из треугольников
Grid
Плюсы:•Легкая генерация•Быстрая ретопология•Быстрое добавление агентов
Минусы:•Большой объём данных•Медленный поиск пути
Подробнее:http://www-cs-students.stanford.edu/~amitp/game-programming/grids/
Hexagonal Grid
Плюсы:•Одинаковая длина шага к любому соседу
Минусы:•Большой объём данных•Медленный поиск пути•Чуть более сложная математика
Подробнее:http://www.redblobgames.com/grids/hexagons/
Navmesh
Плюсы:•Меньше объём данных•Не зависит от размера области•Быстрый поиск
Минусы:•Высокая сложность построения, ретопологии и добавления агентов
Подробнее:https://docs.unity3d.com/Manual/nav-NavigationSystem.html
Поиск пути(Pathfinding)3
Алгоритм ДейкстрыВолнами перебирает вершины от исходной в порядке удаления
А* (А-стар)Перебирает вершины с учётом расстояния между исходной или конечной точкой, а также с учётом стоимости вершин (penalties)
Подробнее:http://www.redblobgames.com/pathfinding/a-star/introduction.html
Навигация4RVO / HRVO (Учёт взаимных скоростей)http://gamma.cs.unc.edu/HRVO/
Boids (Стайное поведение)https://habrahabr.ru/post/182382/
Potential field (Навигация + пасфайндинг)https://habrahabr.ru/post/262181/
Пробуем применитьна примере условного
Clash of Clams Beach
Управление1Finite State MachineБудет оптимальным вариантом, т.е. игровая логика довольно простая и количество состояний не большое.
Поиск цели
Навигация
Атака
Смерть
Топология2GridУдобнее соотносить со строительной сеткой.
• Два размера у зданий
• Сдвиг на пол клетки
Поиск пути3Любимый А*Выбран Grid, следовательно используем для поиска пути быстрый и удобный А*. Можно ещё посмотреть в сторону Potential Field.
Навигация4Зависит от требований.
Оптимальнее всего игнорировать коллизии и симулировать стайное поведение с помощью небольшой рандомизации точек пути.
А теперь о грустном(проблемах)
ивесёлом
(решениях)!
Асинхронность1Разбивайте задачи по времени.200 юнитов за 1 фрейм – плохо.5 фреймов по 40 юнитов – хорошо!
Визуально разницы нет. Если нет разницы, зачем платить больше!?
Мультипоточность2Поиск пути – дорогая операция!Поиск пути в отдельных потоках, чтобы при любом количестве вычислений убрать просадки FPS.
Пулинг3Реюзабельность – наше всё!Взять из пула быстрее чем инстанциировать.Потоков тоже касается, ThreadPool в помощь.Можно кешировать даже списки (Array и List).
Кеширование4Дважды в одну воду!Если что-то уже получено или посчитано, ни в коем случае нельзя это повторять. Кешировать можно всё, начиная от настроек, и вплоть до математических операций.
Кое-где кешируют даже синусы.
Микрооптимизации5Много по малу – уже много!?
• Отказываемся от квадратных корней там где
можно.
• Ограничиваем точность вычислений.
• Заменяем деление умножением.
• И т.д.
Отсекайте ненужное6Для уменьшения вычислений, обсчитывайте только реально играющие роль сущности.Дополнительное разбиение пространства подобно тому, как это делают физические движки.
Правильные структуры7Подбирайте для задач оптимальные структуры данных.
• Для сортировки в навигации BinaryHeap.• Для прохода по спискам переменной длины
LinkedList.• Для прямого доступа Array.• Struct вместо Class там где это требуется.
Скорость прежде всего8Скорость чуть важнее памяти.
Если известен максимум, лучше заранее создать хранилище нужного размера: Array[max] или List(max).
Want some more?1. http://www.redblobgames.com/
2. Game AI Pro: https://www.amazon.com/Game-AI-Pro-Collected-Professionals/dp/1466565969/
3. Game AI Pro 2: https://www.amazon.com/Game-AI-Pro-Collected-Professionals/dp/1482254794/
4. http://www.slideshare.net/flashgamm/artificial-intelligence-in-games-62568832
Top Related