Quadtrees используются, когда вам нужно хранить только те вещи, которые эффективно находятся на плоскости. Как юниты в классической стратегии в реальном времени, где все они находятся на земле или немного над ней. По сути, каждый узел имеет ссылки на 4 дочерних узла, которые делят пространство узла на равномерно распределенные четверти.
Октодеревья делают то же самое, но во всех трех измерениях, а не только в двух, и поэтому они имеют 8 дочерних узлов и делят пространство на восьмерки. Их следует использовать, когда игровые сущности распределены более равномерно по всем трем измерениям.
Если вы ищете двоичное дерево — например, красно-черное дерево — тогда вы хотите использовать структуру данных, называемую двоичным деревом разделения пространства (BSP-деревом), или его версию, называемую деревом KD. Они разбивают пространство пополам с помощью плоскости, в дереве KD плоскости ортогональны (по осям XZ, XY, ZY), поэтому иногда это лучше работает в 3D-сцене. BSP-деревья делят сцену с помощью плоскостей в любой ориентации, но они могут быть весьма полезными, и они использовались еще в Doom.
Теперь, поскольку вы разделили игровое пространство, вам больше не нужно проверять каждый игровой объект на соответствие всем другим игровым объектам, чтобы увидеть, сталкиваются ли они, что в лучшем случае является алгоритмом O (n ^ 2). Вместо этого вы запрашиваете структуру данных, чтобы вернуть игровые объекты в подобласти игрового пространства, и выполняете обнаружение столкновений только для этих узлов друг с другом.
Это означает, что обнаружение коллизий для всех игровых сущностей должно быть операцией n O(nlogn) (в худшем случае).
Несколько дополнительных вещей, на которые следует обратить внимание:
- Убедитесь, что вы тестируете игровые объекты из соседних узлов, а не только из текущего узла, поскольку они все еще могут конфликтовать.
- Перебалансируйте структуру данных после перемещения сущностей, так как теперь у вас могут быть пустые узлы в структуре данных или те, которые содержат слишком много сущностей для хорошей производительности (также вырожденный случай, когда все сущности находятся в одном узле).
person
Daemin
schedule
16.12.2008