खोज से बचने पर कुछ विचार जो पूरी तरह से विफल रास्तों के परिणामस्वरूप होते हैं:
द्वीप आईडी
A * खोजों को प्रभावी ढंग से समाप्त करने के लिए सबसे सस्ते तरीकों में से एक है कोई खोज नहीं करना। यदि क्षेत्र सभी एजेंटों द्वारा वास्तव में अगम्य हैं, तो बाढ़ प्रत्येक क्षेत्र को लोड (या पाइपलाइन में) पर एक अद्वितीय द्वीप आईडी के साथ भर देती है । जब जांच pathfinding अगर द्वीप आईडी पथ की उत्पत्ति का मेल खाता द्वीप आईडी गंतव्य की। यदि वे मेल नहीं खाते हैं तो खोज करने का कोई मतलब नहीं है - दो बिंदु अलग-अलग, असंबद्ध द्वीपों पर हैं। यह केवल तभी मदद करता है जब सभी एजेंटों के लिए वास्तव में अगम्य नोड्स हों।
ऊपरी सीमा को सीमित करें
मैं खोजे जा सकने वाले नोड्स की अधिकतम सीमा को सीमित करता हूं। यह अगम्य खोजों को हमेशा के लिए चलाने में मदद करता है, लेकिन इसका अर्थ है कि कुछ निष्क्रिय खोजें जो बहुत लंबी हैं वे खो सकती हैं। इस संख्या को देखते रहने की जरूरत है, और यह वास्तव में समस्या को हल नहीं करता है, लेकिन यह लंबी खोजों के साथ जुड़े लागतों को कम करता है।
यदि आप जो खोज रहे हैं वह यह है कि इसमें बहुत अधिक समय लग रहा है तो निम्नलिखित तकनीकें उपयोगी हैं:
इसे अतुल्यकालिक और सीमा परिवर्तन करें
खोज को एक अलग थ्रेड या प्रत्येक फ्रेम में थोड़ा सा चलने दें ताकि खेल खोज के इंतजार में रुक न जाए। चरित्र खंगालने वाले सिर या पैरों को मोड़ते हुए, या जो कुछ भी उचित हो, खोज के खत्म होने का इंतजार करते हुए प्रदर्शन करें। इसे प्रभावी ढंग से करने के लिए, मैं खोज की स्थिति को एक अलग वस्तु के रूप में रखूंगा और कई राज्यों के अस्तित्व की अनुमति दूंगा। जब एक पथ का अनुरोध किया जाता है, तो एक स्वतंत्र राज्य ऑब्जेक्ट को पकड़ो और इसे सक्रिय राज्य वस्तुओं की कतार में जोड़ें। अपने पाथफाइंग अपडेट में, कतार के सामने से सक्रिय आइटम को खींचें और ए * चलाएं जब तक कि ए या पूरा नहीं हो जाता है या बी कुछ पुनरावृत्तियों की सीमा चलता है। यदि पूर्ण हो, तो राज्य ऑब्जेक्ट को मुक्त राज्य ऑब्जेक्ट्स की सूची में वापस रखें। यदि यह पूरा नहीं हुआ है, तो इसे 'सक्रिय खोजों' के अंत में रखें और अगले एक पर ले जाएं।
सही डेटा संरचना चुनें
सुनिश्चित करें कि आप सही डेटा संरचनाओं का उपयोग करते हैं। यहां बताया गया है कि मेरा StateObject कैसे काम करता है। मेरे सभी नोड्स को एक परिमित संख्या के लिए पूर्व-आवंटित किया गया है - प्रदर्शन कारणों से 1024 या 2048 - कहें। मैं एक नोड पूल का उपयोग करता हूं जो नोड्स के आवंटन को गति देता है और यह मुझे अपने डेटा स्ट्रक्चर्स में पॉइंटर्स के बजाय इंडेक्स स्टोर करने की अनुमति देता है जो कि u16s हैं (या अगर मेरे पास 255 अधिकतम नोड्स हैं, जो मैं कुछ गेमों पर करता हूं)। अपने पथ-प्रदर्शक के लिए, मैं खुली सूची के लिए एक प्राथमिकता कतार का उपयोग करता हूं, नोड ऑब्जेक्ट्स पर पॉइंटर्स संग्रहीत करता हूं। इसे बाइनरी हीप के रूप में लागू किया गया है, और मैं फ़्लोटिंग पॉइंट वैल्यूज़ को सॉर्टर्स के रूप में सॉर्ट करता हूं क्योंकि वे हमेशा सकारात्मक होते हैं और मेरे प्लेटफ़ॉर्म में फ्लोटिंग पॉइंट की तुलना होती है। मेरे द्वारा देखे गए नोड्स का ट्रैक रखने के लिए मैं अपने बंद नक्शे के लिए हैशटेबल का उपयोग करता हूं। यह कैश आकार को बचाने के लिए, नोड्स को नहीं, नोड्स को संग्रहीत करता है।
कैच व्हाट यू कैन
जब आप पहली बार किसी नोड पर जाते हैं और गंतव्य की दूरी की गणना करते हैं, तो उस कैश को स्टेट ऑब्जेक्ट में संग्रहीत किया जाता है। यदि आप फिर से गणना करते हैं तो नोड फिर से गणना करने के बजाय कैश्ड परिणाम का उपयोग करता है। मेरे मामले में यह संशोधित नोड्स पर एक वर्गमूल नहीं करने में मदद करता है। आप पा सकते हैं कि ऐसे अन्य मूल्य हैं जिन्हें आप पूर्वगामी और कैश कर सकते हैं।
आगे के क्षेत्रों में आप जांच कर सकते हैं: या तो अंत से खोज करने के लिए दो-तरफा पाथफाइंडिंग का उपयोग करें। मैंने ऐसा नहीं किया है, लेकिन जैसा कि दूसरों ने नोट किया है कि यह मदद कर सकता है, लेकिन इसके बिना यह नहीं है। मेरी सूची में कोशिश करने के लिए दूसरी बात है पदानुक्रमित पाथफाइंडिंग, या क्लस्टरिंग पाथ फाइंडिंग। हॉकॉकी प्रलेखन में एक दिलचस्प विवरण है यहां उनकी क्लस्टरिंग अवधारणा का वर्णन किया गया है, जो यहां वर्णित एचपीए * कार्यान्वयन से अलग है ।
सौभाग्य, और हमें बताएं कि आप क्या पाते हैं।