AI and navigation in games: problems, solutions, mobile platform optimization

Post on 25-Jan-2017

98 views 0 download

Transcript of AI and navigation in games: problems, solutions, mobile platform optimization

ИИ и навигация в играх.

Козанов Тимур

Проблемы, решения, оптимизация под мобильные платформы.

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

Всем спасибо!

Козанов ТимурDouble Dice Games

https://www.facebook.com/tim.kozanovbigramx@gmail.com