"Area of Effect Scanning" (сканирование области влияния, AoE Scanning) — это термин, который часто используется в контексте компьютерных игр. Он относится к процессу определения того, какие сущности находятся в определенной зоне влияния (Area of Effect, AoE) относительно какой-либо точки или другой сущности. Это может быть актуально, например, при применении заклинаний, ударов или других действий, которые влияют не на одну цель, а на область.
> Данный термин был получен от ChatGPT. В Google-поисковике он почти не фигурирует. Скорее всего термин не является общепринятым.
### Какие способы можно применить
Предположим, нужно обработать 10 000 сущностей, производительность способов сканирования области влияния будет иметь критическое значение. В этом случае таблица будет выглядеть следующим образом:
| Метод | Производительность | Преимущества | Недостатки |
| ----------------------------------- | --------------------------- | ------------------------------------ | -------------------------------- |
| Коллайдеры в Unity | Средняя - Низкая | Прост в реализации, интегрирован в Unity | Медленный с большим количеством объектов; высокая нагрузка на CPU |
| [[Как измерить расстояние между двумя точками в пространстве\|Поиск соседей на основе расстояния]] | Средняя - Низкая | Прост в реализации, может быть оптимизирован | Сложно масштабировать; [[Asymptotic Complexity и Time Complexity (Асимптотическая сложность и Временная сложность)\|O(n^2)]] сложность |
| [[Spatial Data Structures (Пространственные структуры данных)]] | Высокая | Оптимизирован для большого числа объектов, быстрый поиск | Сложнее в реализации |
| [[Эвристика (Heuristic)\|Эвристические]] методы (Heuristic Methods) | Средняя - Высокая | Может снизить количество проверок | Требуется дополнительная логика, не всегда точный |
| Сортировка и бинарный поиск (Sorting & Binary Search) | Средняя | Быстрый поиск по отсортированной структуре | Требуется предварительная сортировка, что может быть дорогостоящим |
##### Пространственные структуры данных
Вместо того, чтобы перебирать каждую сущность в игровом мире для определения, находится ли она внутри заданной области AoE, вы можете использовать, к примеру, [[Quadtree (Квадродерево)]] для сокращения числа потенциальных кандидатов.
Для поиска всех сущностей внутри определённой области (например, круга с радиусом `radius` и центром в точке `(x, y)`), вы можете написать код так:
```csharp
//Создаем прямоугольник на основе круга.
var area = new Rectangle(x - radius, y - radius, radius * 2, radius * 2);
// Создаем пустой список для найденных сущностей
List<Rectangle>returnObjects = new List<Rectangle>();
//Получаем список сущностей, которые пересекаются с нашим прямоугольником или находятся внутри него.
quadTree.Retrieve(returnObjects, area);
// Фильтруем, чтобы убедиться, что сущности находятся внутри круга, а не только прямоугольника
var actualEntitiesInAoE = returnObjects.Where(entity =>
Math.Pow(entity.X - x, 2) + Math.Pow(entity.Y - y, 2) <= radius * radius
).ToList();
```
##### Эвристические методы (Heuristic Methods)
Использование эвристических методов для предположения наличия врагов в определенных зонах. Например, если в какой-то зоне было обнаружено много врагов ранее, её можно чаще проверять.
Выбор метода зависит от многих факторов: от количества юнитов, их распределения по карте, от того, насколько часто они перемещаются, и так далее. Комбинирование нескольких методов часто приводит к наилучшему результату.
##### Сортировка и бинарный поиск (Sorting & Binary Search)
Если юниты можно как-то упорядочить (например, по расстоянию до центра карты), можно использовать бинарный поиск для быстрого нахождения кандидатов для проверки.
### Как можно оптимизировать
- [[Lazy Evaluation (Ленивая проверка)]]