Beberapa gagasan untuk menghindari pencarian yang menghasilkan jalur yang gagal sama sekali:
ID Pulau
Salah satu cara termurah untuk menyelesaikan pencarian A * secara lebih cepat adalah dengan tidak melakukan pencarian sama sekali. Jika area tersebut benar-benar tidak mungkin dilewati oleh semua agen, banjir memenuhi setiap area dengan ID Pulau yang unik pada muatan (atau dalam pipa). Ketika merintis jalan, periksa apakah ID Pulau asal jalur cocok dengan ID Pulau tujuan. Jika mereka tidak cocok tidak ada gunanya melakukan pencarian - kedua titik berada di pulau yang berbeda dan tidak terhubung. Ini hanya membantu jika ada simpul yang benar-benar tidak bisa dilewati untuk semua agen.
Batasi batas atas
Saya membatasi batas atas jumlah maksimum node yang dapat dicari. Ini membantu pencarian yang tidak dapat dilewati untuk berjalan selamanya, tetapi itu berarti beberapa pencarian yang lumayan lama dapat hilang. Nomor ini perlu disetel, dan itu tidak benar-benar menyelesaikan masalah, tetapi mengurangi biaya yang terkait dengan pencarian panjang.
Jika yang Anda temukan adalah terlalu lama maka teknik-teknik berikut berguna:
Jadikan Asinkron & Batasi Iterasi
Biarkan pencarian berjalan di utas terpisah atau sedikit setiap frame sehingga permainan tidak berhenti menunggu pencarian. Tampilkan animasi karakter menggaruk kepala atau menginjak-injak kaki, atau apa pun yang sesuai sambil menunggu pencarian berakhir. Untuk melakukan ini secara efektif, saya akan menjaga Negara pencarian sebagai objek terpisah dan memungkinkan beberapa negara ada. Ketika jalur diminta, ambil objek status bebas dan tambahkan ke antrian objek status aktif. Dalam pembaruan penelusuran jalan Anda, tarik item aktif dari depan antrian dan jalankan A * hingga A. selesai atau B. beberapa batas iterasi dijalankan. Jika selesai, masukkan kembali objek state ke daftar objek state bebas. Jika belum selesai, letakkan di akhir 'pencarian aktif' dan pindah ke yang berikutnya.
Pilih Struktur Data yang Tepat
Pastikan Anda menggunakan struktur data yang tepat. Inilah cara kerja StateObject saya. Semua node saya sudah dialokasikan sebelumnya ke nomor yang terbatas - misalnya 1024 atau 2048 - untuk alasan kinerja. Saya menggunakan kumpulan node yang mempercepat alokasi node dan juga memungkinkan saya untuk menyimpan indeks, bukan pointer dalam struktur data saya yang u16s (atau u8 jika saya memiliki 255 max node, yang saya lakukan pada beberapa game). Untuk pathfinding saya, saya menggunakan antrian prioritas untuk daftar terbuka, menyimpan pointer ke objek Node. Ini diimplementasikan sebagai tumpukan biner, dan saya mengurutkan nilai floating point sebagai bilangan bulat karena selalu positif dan platform saya memiliki perbandingan floating point yang lambat. Saya menggunakan hashtable untuk peta tertutup saya untuk melacak node yang saya kunjungi. Ini menyimpan NodeID, bukan Node, untuk menghemat ukuran cache.
Cache What You Can
Ketika Anda pertama kali mengunjungi sebuah node dan menghitung jarak ke tujuan, cache itu di node yang disimpan di Object Negara. Jika Anda mengunjungi kembali simpul tersebut gunakan hasil cache bukannya menghitungnya lagi. Dalam kasus saya ini membantu tidak harus melakukan root kuadrat pada node yang telah ditinjau. Anda mungkin menemukan ada nilai-nilai lain yang dapat Anda prakalkulasi dan cache.
Area lebih lanjut yang dapat Anda selidiki: gunakan pencarian jalur dua arah untuk mencari dari kedua ujungnya. Saya belum melakukan ini tetapi karena orang lain telah mencatat ini mungkin membantu, tetapi bukan tanpa peringatan itu. Hal lain dalam daftar saya untuk dicoba adalah pencarian jalan hierarkis, atau pencarian jalur pengelompokan. Ada deskripsi menarik dalam dokumentasi HavokAI Here yang menjelaskan konsep pengelompokan mereka, yang berbeda dari implementasi HPA * yang dijelaskan di sini .
Semoga beruntung, dan beri tahu kami apa yang Anda temukan.