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