Я додав би це як коментар у відповідь на відповідь @Nathan Reed, за винятком того, що він занадто великий, щоб бути коментарем, і, можливо, у будь-якому випадку гідний, щоб бути окремою відповіддю.
Ми робили саме те, що було запропоновано у його відповіді, і насправді маємо коментар у джерелі, що посилається на цю сторінку. Здебільшого це спрацювало надзвичайно добре, за винятком того, що раз на два-три місяці ми випадково втрачаємо сервер, який не реагує через велику тривалість пошукових запитів.
Першопричину проблеми з'явилася мені під час перевірки ефективності, щоб спробувати зрозуміти, що це було причиною. Це може викликати занепокоєння, якщо ви дозволите об'єкти, що перекриваються. У нашій грі ми це робимо, і в гіршому випадку це періодично призводить до продуктивності вбивства.
У нас був один крайній випадок, коли близько 100 об’єктів, усі з обмежуючими дисками, були згруповані в дуже близькій близькості. Це призвело до проблеми дуже глибокого шипа на дереві, тому що ми дійшли до того, що об’єктів було більше, ніж площа, покрита квадратурними вузлами, тому кожен новий об’єкт з'являвся у кількох вузлах, що призводить до масового підрозділу дерево, таким чином, сніговики проблему виходять з-під контролю.
Висновок цього полягає в тому, що якщо ви дозволяєте областям об'єктів перекриватися, уважно стежте за речами, якщо у вас є щільні скупчення об'єктів, щоб ваше дерево не заглиблювалося занадто глибоко.
Я зараз досліджую рішення - зберігати об’єкти у вигляді точок, а потім, здійснюючи пошук, збільшуйте межі прямокутника пошуку на максимальний радіус, збережений у дереві. Це повинно працювати для нас, оскільки дерево - це перший пошук, ми робимо перевірку діапазону на основі справжнього кола, а також кілька інших перевірок критеріїв, тому додаткові помилкові сповіщення будуть відфільтровані.
Ваш фактичний пробіг може відрізнятися.