Latar Belakang
Bersama dengan seorang teman saya sedang mengerjakan game 2D yang diatur dalam ruang. Untuk menjadikannya se-immersif dan seinteraktif mungkin, kami ingin ada ribuan objek melayang bebas, beberapa berkerumun bersama, yang lain terapung di ruang kosong.
Tantangan
Untuk melepaskan beban rendering dan mesin fisika kita perlu mengimplementasikan semacam partisi spasial. Ada dua tantangan yang harus kita atasi. Tantangan pertama adalah bahwa semuanya bergerak sehingga merekonstruksi / memperbarui struktur data harus sangat murah karena harus dilakukan setiap frame. Tantangan kedua adalah distribusi objek, seperti yang dikatakan sebelumnya mungkin ada kelompok objek bersama-sama dan potongan-potongan besar ruang kosong dan untuk membuatnya lebih buruk lagi tidak ada batas ruang.
Teknologi yang ada
Saya telah melihat teknik yang ada seperti BSP-Trees, QuadTrees, kd-Trees dan bahkan R-Trees tetapi sejauh yang saya tahu struktur data ini tidak cocok karena memperbarui banyak objek yang telah pindah ke sel lain relatif mahal.
Apa yang saya coba
Saya membuat keputusan bahwa saya membutuhkan struktur data yang lebih diarahkan pada penyisipan cepat / pembaruan daripada memberikan kembali jumlah paling sedikit dari kemungkinan hit yang diberikan kueri. Untuk tujuan itu saya membuat sel-sel tersirat sehingga setiap objek, mengingat posisinya, dapat menghitung sel mana yang seharusnya. Lalu saya menggunakan HashMap
yang memetakan koordinat sel ke ArrayList
(isi sel). Ini bekerja cukup baik karena tidak ada memori yang hilang pada sel 'kosong' dan mudah untuk menghitung sel mana yang akan diperiksa. Namun membuat semua ArrayList
itu (kasus terburuk N) mahal dan begitu juga tumbuh HashMap
banyak kali (walaupun itu sedikit dikurangi dengan memberikannya kapasitas awal yang besar).
Masalah
OK jadi ini berfungsi tetapi masih tidak terlalu cepat. Sekarang saya dapat mencoba untuk mengoptimalkan kode JAVA mikro. Namun saya tidak berharap terlalu banyak karena profiler memberi tahu saya bahwa sebagian besar waktu dihabiskan untuk membuat semua objek yang saya gunakan untuk menyimpan sel. Saya berharap ada beberapa trik / algoritma lain di luar sana yang membuat ini jauh lebih cepat, jadi inilah struktur data ideal saya:
- Prioritas nomor satu adalah memperbarui / merekonstruksi seluruh struktur data dengan cepat
- Ini kurang penting untuk membagi benda menjadi tempat sampah berukuran sama, kita bisa menggambar beberapa objek tambahan dan melakukan beberapa pemeriksaan tabrakan tambahan jika itu berarti memperbarui sedikit lebih cepat
- Memori tidak terlalu penting (permainan PC)