spacehash

0
README.md

Logo

Space Hash

Реализация хеширования конечного 2D/3D пространства для быстрого поиска объектов в определенном радиусе.

ВАЖНО! Требует C#9 (или Unity >=2021.2).

ВАЖНО! Не забывайте использовать

DEBUG
-версии билдов для разработки и
RELEASE
-версии билдов для релизов: все внутренние проверки/исключения будут работать только в
DEBUG
-версиях и удалены для увеличения производительности в
RELEASE
-версиях.

ВАЖНО! Проверено на Unity 2021.3 (не зависит от нее) и содержит asmdef-описания для компиляции в виде отдельных сборок и уменьшения времени рекомпиляции основного проекта.

Социальные ресурсы

Официальный блог: https://leopotam.ru

Установка

В виде unity модуля

Поддерживается установка в виде unity-модуля через git-ссылку в PackageManager или прямое редактирование

Packages/manifest.json
:

"ru.leopotam.spacehash": "https://gitverse.ru/leopotam/spacehash.git",

В виде исходников

Код так же может быть склонирован или получен в виде архива со страницы релизов.

Прочие источники

Официальная работоспособная версия размещена по адресу https://gitverse.ru/leopotam/spacehash, все остальные версии (включая nuget, npm и прочие репозитории) являются неофициальными клонами или сторонним кодом с неизвестным содержимым.

Основные типы

SpaceHash2

Представляет собой хеширование конечного 2D-пространства регулярной сеткой для быстрого поиска объектов в определенном радиусе. Экземпляр создается с явным указанием шага сетки и размеров пространства (все объекты вне этого пространства будут автоматически включаться в пограничные клетки, ухудшая производительность в поиске по ним):

ВАЖНО! Идентификатор объекта задается пользователем в качестве типа обобщения (может быть любым типом), в примерах будет использоваться тип

string
.

Объекты являются точками без размеров и могут добавляться в любом количестве в хеш:

После добавления всех объектов можно выполнять поиск объектов, находящихся в указанной точке с определенным радиусом:

ВАЖНО! Рекомендуется держать размер радиуса поиска в пределах 1-2 размеров шага сетки пространства. Это не ограничение, а рекомендация, размер сетки следует подбирать под задачу и проводить замеры производительности и потребления памяти.

Для уменьшения аллокаций список результатов может быть использован повторно, для этого его следует передать опциональным параметром:

Если нужен только один самый ближайший объект, то можно воспользоваться следующим методом:

В этом случае вернется успешность операции (найден объект или нет) и информация о нем.

Если нужно только узнать наличие любого объекта в радиусе без определения самого ближнего, то можно воспользоваться следующим методом:

После запросов хеш можно очистить и переиспользовать для нового наполнения и запросов:

ВАЖНО! Заполнение и очистка хеша не потокобезопасны и должны выполняться из основного потока. Запросы объектов из хеша потокобезопасны и могут выполняться из нескольких потоков.

Так же поддерживается поиск в пределах кольца, ограниченного внешним и внутренним радиусами - методы

HasInRing()
,
GetInRing()
и
GetOneInRing()
- функционал аналогичен
HasInRing()
,
GetInRing()
и
GetOneInRing()
, в параметрах внутренний радиус
intRadius
, а внешний радиус
extRadius
.

SpaceHash3

Представляет собой хеширование конечного 3D-пространства регулярной сеткой для быстрого поиска объектов в определенном радиусе. Весь функционал идентичен

SpaceHash2
за исключением поиска по кольцу, в параметры координат добавляется третья ось (Z).

Лицензия

Расширение выпускается под лицензией MIT-ZARYA, подробности тут.