Saya akan menambahkan ini sebagai komentar sebagai jawaban atas jawaban @Nathan Reed, kecuali terlalu besar untuk menjadi komentar, dan mungkin dalam hal apa pun layak menjadi jawaban yang terpisah.
Kami melakukan persis apa yang diusulkan dalam jawabannya, dan bahkan memiliki komentar di sumber yang menghubungkan ke halaman ini. Sebagian besar, ini telah bekerja dengan sangat baik, kecuali bahwa sekali setiap dua atau tiga bulan, kami telah kehilangan server secara acak yang tidak responsif karena lamanya permintaan pencarian.
Penyebab utama masalah ini menjadi perhatian saya saat melakukan pemeriksaan kinerja untuk mencoba dan mencari tahu apa penyebabnya. Kemungkinan hanya masalah jika Anda mengizinkan objek yang tumpang tindih. Dalam permainan kami, kami lakukan, dan dalam skenario terburuk itu kadang-kadang menyebabkan lonjakan kedalaman membunuh kinerja.
Kami memiliki satu kasus tepi di mana sekitar 100 objek, semua dengan disk pembatas, dikelompokkan dalam jarak sangat dekat. Itu mengarah pada masalah lonjakan yang sangat dalam di pohon, karena kami sampai pada titik di mana objek lebih besar dari area yang dicakup oleh node quadtree, sehingga setiap objek baru muncul di beberapa node, yang mengarah ke subdivisi besar-besaran dari pohon, sehingga bola salju masalah di luar kendali.
Hal yang dapat diambil dari hal ini adalah jika Anda membiarkan daerah objek tumpang tindih, awasi dengan cermat benda-benda jika Anda mendapatkan kumpulan benda yang rapat, untuk memastikan pohon Anda tidak terlalu dalam.
Solusi yang saya selidiki saat ini adalah untuk menyimpan objek sebagai titik, dan kemudian ketika melakukan pencarian, tambahkan batas-batas persegi panjang pencarian dengan jari-jari maksimum yang tersimpan di pohon. Itu akan bekerja untuk kita, karena pohon adalah pencarian lulus pertama, kita kemudian melakukan pemeriksaan rentang berbasis lingkaran yang benar, bersama dengan beberapa pengecekan kriteria lainnya, sehingga peringatan palsu tambahan akan disaring.
Jarak tempuh Anda yang sebenarnya mungkin berbeda.