Saya telah mengalami beberapa masalah dengan menentukan secara efisien apakah kamar besar disegel dalam ruang 3D berbasis voxel. Saya pada titik di mana saya telah berusaha sekuat tenaga untuk menyelesaikan masalah tanpa meminta bantuan, tetapi tidak mencoba cukup untuk menyerah, jadi saya meminta bantuan.
Untuk memperjelas, disegel adalah bahwa tidak ada lubang di ruangan. Ada sealer oksigen, yang memeriksa apakah ruangan disegel, dan segel tergantung pada tingkat input oksigen.
Saat ini, inilah yang saya lakukan:
- Mulai dari blok di atas ubin sealer (lubang ada di wajah atas sealer), secara loop berulang melalui semua 6 arah yang berdekatan
- Jika ubin yang berdekatan penuh, non-vakum, lanjutkan melalui loop
- Jika ubin yang berdekatan tidak penuh, atau merupakan ubin vakum, periksa apakah blok yang berdekatan adalah, secara rekursif.
- Setiap kali ubin dicentang, kurangi penghitung
- Jika penghitungan mencapai nol, jika blok terakhir berbatasan dengan ubin vakum, kembalikan bahwa area tersebut tidak disegel
- Jika penghitungan mencapai nol dan blok terakhir bukan ubin vakum, atau loop rekursif berakhir (tidak ada ubin vakum tersisa) sebelum penghitung adalah nol, area disegel
Jika area tidak disegel, jalankan loop lagi dengan beberapa perubahan:
- Memeriksa blok yang berdekatan untuk ubin "udara bernapas" bukan ubin vakum
- Alih-alih menggunakan penghitung pengurangan, lanjutkan sampai tidak ada ubin "udara bernafas" yang berdekatan ditemukan.
- Setelah loop selesai, atur setiap blok yang dicentang ke ubin vakum.
Berikut kode yang saya gunakan: http://pastebin.com/NimyKncC
Masalah:
Saya menjalankan pemeriksaan ini setiap 3 detik, kadang-kadang sealer harus melewati ratusan blok, dan sebuah dunia besar dengan banyak sealer oksigen, beberapa loop rekursif ini setiap beberapa detik bisa sangat sulit pada CPU.
Saya bertanya-tanya apakah ada orang yang lebih berpengalaman dengan optimasi dapat membantu saya, atau setidaknya mengarahkan saya ke arah yang benar. Terima kasih banyak.