Tamamen başarısız yollarla sonuçlanan aramalardan kaçınmaya ilişkin bazı fikirler:
Ada Kimliği
A * aramalarını daha hızlı bir şekilde bitirmenin en ucuz yollarından biri hiç arama yapmamaktır. Alanlar tüm ajanlar tarafından gerçekten geçilmezse, sel her alanı yükte (veya boru hattında) benzersiz bir Ada Kimliği ile doldurun . Yol bulmayı yaparken , yolun orijininin Ada Kimliği’nin Ada kimliği hedef. Eşleşmiyorlarsa, aramanın hiçbir anlamı yoktur - iki nokta birbiriyle bağlantısı olmayan adalardadır. Bu, yalnızca tüm ajanlar için gerçekten geçilemez düğümler varsa yardımcı olur.
Sınırı üst sınır
Aranabilecek maksimum düğüm sayısının üst sınırını sınırlarım. Bu, geçilmez aramaların sonsuza dek yayınlanmamasına yardımcı olur, ancak çok uzun süren bazı fena aramaların kaybedilmesi anlamına gelir. Bu sayının ayarlanması gerekiyor ve gerçekten çözülmiyor ve sorunu , ancak uzun aramalarla ilişkili maliyetleri azaltır.
Eğer bulduğunuz şey çok uzun sürüyorsa, aşağıdaki teknikler kullanışlıdır:
Asenkron ve Limit Yinelemeleri Yap
Arama, her bir karede ayrı bir iş parçacığında ya da bir bitte yayınlansın, böylece oyun aramayı beklemiyor. Karakterin çizilme kafası veya damgalama ayaklarının animasyonunu veya aramanın bitmesini beklerken uygun olanı gösterin. Bunu etkili bir şekilde yapmak için, araştırmanın durumunu ayrı bir nesne olarak tutacağım ve birden fazla devletin var olmasına izin vereceğim. Bir yol istendiğinde, bir serbest durum nesnesini alın ve onu aktif durum nesnelerinin kuyruğuna ekleyin. Yol bulma güncellemenizde, etkin öğeyi sıranın önünden çekin ve A * işlemini tamamlayana kadar ya da B. bazı yineleme sınırlarının çalışmasına kadar çalıştırın. Tamamlandıysa, durum nesnesini serbest durum nesneleri listesine geri yerleştirin. Tamamlanmadıysa, 'aktif aramaların' sonuna koyun ve bir sonrakine geçin.
Doğru Veri Yapıları Seçin
Doğru veri yapılarını kullandığınızdan emin olun. İşte StateObject'imin çalışması. Tüm düğümlerim performans nedenlerinden dolayı sonlu bir sayıya - 1024 ya da 2048 - diyelim. Düğümlerin tahsisini hızlandıran bir düğüm havuzu kullanıyorum ve aynı zamanda u16'lar olan veri yapılarımda işaretçiler yerine indeksler depolamamı sağlıyor (ya da bazı oyunlarda yaptığım 255 maksimum düğümüm varsa u8). Yol bulucum için, işaretçileri Node nesnelerine depolayarak, açık liste için bir öncelik sırası kullanıyorum. İkili öbek olarak uygulanır ve kayan nokta değerlerini tam sayılar olarak sıralarım, çünkü platformum her zaman pozitifdir ve platformumda yavaş kayan nokta karşılaştırılır. Kapalı haritam için ziyaret ettiğim düğümleri takip etmek için bir karma tablo kullanıyorum. Önbellek boyutlarından tasarruf etmek için Düğümleri değil, Düğümleri saklar.
Önbellek Yapabilecekleriniz
Bir düğümü ilk ziyaret edip hedefe olan mesafeyi hesapladığınızda, Durum Nesnesinde depolanan düğümde önbellekleyin. Düğümü tekrar ziyaret ederseniz, tekrar hesaplamak yerine önbelleğe alınmış sonucu kullanın. Benim durumumda, tekrar ziyaret edilen düğümler üzerinde karekök yapmamaya yardımcı olur. Önceden hesaplayabileceğiniz ve önbellekleyebileceğiniz başka değerler de vardır.
Araştırabileceğiniz diğer alanlar: iki taraftan da aramak için iki yönlü yol bulma kullanın. Bunu yapmadım ama başkalarının da belirttiği gibi, bunun yardımcı olabileceğini, ancak bunun uyarıları olmadığını söyledi. Listemde denenecek diğer şey, hiyerarşik yol bulma veya kümelenme yolu bulma. HavokAI belgelerinde ilginç bir açıklama var Burada , burada açıklanan HPA * uygulamalarından farklı olan kümeleme kavramlarını açıklar .
İyi şanslar ve ne bulduğunuzu bize bildirin.