एक टॉवर रक्षा खेल में ए * कार्यान्वयन पर धीमा प्रदर्शन


9

मैं फ्लैश में एक टॉवर रक्षा खेल बना रहा हूं जिसमें कोई पूर्वनिर्धारित पथ नहीं है।

हालांकि मेरा ग्रिड 40x40 (छोटा?) है, ए * हर बार पुनर्गणना करते समय संघर्ष कर रहा है। इसलिए मैंने पुनर्गणना को आसान बनाने के लिए अपना संशोधन किया और छुआ हुआ सेल काउंट लगभग 900 तक गिर गया (जब रूट के पास संशोधित किया गया)। यह अभी भी एक बहुत ही कम समय के लिए जमा देता है, लेकिन पता लगाने योग्य है, जब एक नया टॉवर रखा जाता है।

क्या यह एक कार्यान्वयन समस्या है, या 40x40 बहुत अधिक है?

संपादित करें:

मेरे कोड की संरचना:

  • सभी डेटा कोशिकाओं के 2d सरणी में सहेजे गए हैं।
  • प्रत्येक कोशिका में पथ दिशा (1-8 दक्षिणावर्त) में उसके माता-पिता होते हैं और पथ में उसके बच्चों के बिटकॉइन एन्कोडेड सरणी (प्रत्येक बिट एक बच्चे का प्रतिनिधित्व करता है)।
  • यूक्लिडियन दूरी के अनुमान के साथ ए द्वारा खोज की जाती है।

आपको यहां और अधिक विशिष्ट होने की आवश्यकता है। हमें पता नहीं है कि आपका कोड कैसा दिखता है, यह कैसे संरचित है, आदि, और इसलिए हम इसे धीमा करने के बारे में कोई निष्कर्ष नहीं निकाल सकते हैं।
सीन जेम्स

1
जब मैंने आखिरी बार A * लागू किया, तो मुझे याद है कि यह अधिकतम 1ms में 64x64 ग्रिड से चल रहा है । तो हाँ, यह आपके कार्यान्वयन के साथ एक समस्या प्रतीत होती है। मेरा सुझाव है कि आप अपना कोड पोस्ट करें या इसका सार बताएं ताकि हम आगे आपकी मदद कर सकें।
मार्क मुलर

मेरे द्वारा जोड़े गए संपादन को देखें
Dani

1
यदि 40x40 बहुत धीमा है, तो संभावना अच्छी है कि आप कुछ गलत कर रहे हैं। या तो अपना कोड पोस्ट करें या उसे प्रोफाइल करें। वैकल्पिक रूप से, इसे स्केल करें और देखें कि क्या होता है - यदि एक 80x80 ग्रिड चार गुना से अधिक समय लेता है, तो आपको वहां बहुत कुछ टूट गया है।
ज़ोरबहुत

क्या शीर्षक थोड़ा अधिक जानकारीपूर्ण हो सकता है, कृपया?
दस

जवाबों:


4

मैं टिप्पणी नहीं कर सकता, लेकिन फ्लेक्स में पहली प्रोफ़ाइल, बाकी सब कुछ अनुमान है।


मैं फ्लेक्स में फ्लैश प्रोजेक्ट कैसे कर सकता हूं?
दानी

हां और ना। मुझे नहीं लगता कि आप फ़्लैश प्रोजेक्ट को सीधे लोड करते हैं। मुझे लगता है कि आप बिना स्रोत के swf को प्रोफाइल करने में सक्षम हो सकते हैं और फिर भी फ़ंक्शन स्तर की जानकारी प्राप्त कर सकते हैं। मैं "फ्लेक्स में एक फ्लैश प्रोजेक्ट की रूपरेखा" या इस तरह के लिए एक Google खोज करूँगा। मैंने ऐसा किया और मिला: flexblog.edchipman.ca/… जो आशाजनक लगता है।
जोनाथन फिशऑफ

धन्यवाद, वास्तव में मुझे समस्याग्रस्त भाग खोजने में मदद मिली (एल्गोरिथ्म में नहीं था, प्रश्न पर टिप्पणी देखें)
दानी

13

मैं मान रहा हूं कि टीडी 'टॉवर डिफेंस' है

मुझे लगता है कि A * इसके लिए कुछ हद तक खत्म हो रहा है।

खेल की शुरुआत में, बाढ़ एक आंदोलन का नक्शा बनाने के लिए खेल क्षेत्र को निकास बिंदुओं से भरें:

 |---------|
 |5|4|3|3|3|
 |5|4|3|2|2|
->5|4|3|2|1->
 |5|4|3|2|2|
 |5|4|3|3|3|
 |---------|

और आंदोलन हमेशा कम मूल्य वाले वर्ग की ओर होता है।

जब खिलाड़ी एक टॉवर लगाता है, तो आठ आसन्न वर्गों में से प्रत्येक को अपडेट करें: प्रत्येक वर्ग के लिए, यह आंदोलन का मूल्य सबसे कम आसन्न मूल्य से एक से अधिक है। यदि मान बदलता है, तो अद्यतन किए गए वर्ग पर केंद्रित प्रक्रिया को दोहराएं। फिर, यह जांचने के लिए कि निकास का मार्ग अवरुद्ध नहीं है, सुनिश्चित करें कि सभी वर्ग कम मूल्य के वर्ग से सटे हैं।

जब खिलाड़ी एक टॉवर को हटाता है, तो आंदोलन मूल्य को सबसे कम आसन्न वर्ग से एक से अधिक पर सेट करें और ऊपर की प्रक्रिया को दोहराएं।

एक सरल तरीका होगा बाढ़ को फिर से भरना।


6
कम संख्या में इकाइयों के लिए बाढ़ भरण करना A * की तुलना में अधिक महंगा है - मोटे तौर पर, बोर्ड की लंबाई - कम से कम एल्गोरिदमिक शब्दों में (और चूंकि यह फ्लैश है, मेमोरी लेआउट की तरह गैर-एल्गोरिदम स्थिरांक शायद कर सकते हैं ' टी का उपयोग बहुत प्रभावी ढंग से किया जाता है)। हालांकि, यह कई संचार इकाइयों के लिए एक बहुत अच्छा मॉडल है, और इसे सहयोगी प्रसार कहा जाता है - scalablegamedesign.cs.colorado.edu/wiki/Collaborative_Diffusion

@ जोए रेचन: वाह अच्छा लिंक। मैंने पहले भी उस तकनीक का उपयोग किया है लेकिन कभी नहीं पता था कि इसे क्या कहा जाता है। धन्यवाद।
दस

@ जो, जब तक कि नक्शे में कम से कम कुछ अवरोध हैं, मुझे नहीं लगता कि यह ए * कॉल करने से अधिक अक्षम होगा। यही है, मेरा मानना ​​है कि केवल एक व्यापक-खुले, कुछ इकाइयों के साथ लगभग बाधा मुक्त मानचित्र यह बदतर हो सकता है।
edA-qa mort-ora-y

@edA: परिभाषा के अनुसार बाढ़-भरण को अंततः मानचित्र के प्रत्येक सुलभ बिंदु को छूना चाहिए; ए * साबित प्रदान करता है ऊपरी सीमा यह कितने अंक को छूने चाहिए, जो है अधिक से अधिक नक्शे और आम तौर पर अब तक कम पर हर सुलभ बिंदु। बाढ़ भरने के लिए मेमोरी लेआउट जैसी चीजों को अनुकूलित करने के लिए एक सरल एल्गोरिथ्म है, लेकिन जैसा मैंने कहा फ्लैश में, जो शायद कोई फर्क नहीं पड़ता।

@ जो, मैं जो तर्क दे रहा हूं, वह यह है कि केवल एक मुट्ठी भर टावरों के साथ A * संभवतः लगभग सभी स्थानों को छू लेगा। लेकिन एन राक्षसों के लिए इसे बाढ़ से कम कुशल होने के लिए केवल कुल_सेक् / से अधिक होना चाहिए।
eda-qa mort-ora-y

2

अजीब बात है, मुझे लगा कि मैंने इसका जवाब दिया, लेकिन लगता है कि यह जवाब दिया जाएगा। अपनी खोज एल्गोरिथ्म को ऐसे बनाएं कि इसे कई चरणों में अपडेट किया जा सके, ताकि जब आप एक टावर लगाएं और एक एनीमेशन चलाएं, तो आप हर फ्रेम को थोड़ा सा कर सकते हैं और आपके अपडेट करने के लिए आधे से एक सेकंड के बीच कहीं होगा एक * बिना ध्यान देने योग्य ठहराव। यह विलंबता है - iF आप इसे गति नहीं दे सकते, इसे छिपाने का एक तरीका खोजें। एक टॉवर लगाते समय एक एनीमेशन खेलना एक खेल के लिए स्वाभाविक होगा और इसे छिपाने के लिए एक अच्छी जगह को इमो करना होगा।


यह सामान्य रूप से एक अच्छा विचार है, लेकिन इस विशिष्ट प्रश्न के लिए बुरा है। ए * इतने छोटे ग्रिड पर लगभग तुरंत होना चाहिए, महत्वपूर्ण समय नहीं लेना चाहिए।
davr

काफी उचित। यह एकमात्र उत्तर है जो मैं दे सकता हूं कि कार्यान्वयन विवरणों को जानने के बिना समस्या का समाधान होगा जो मंदी का कारण होगा।
काज

0

एक शुरुआत के लिए आप अपने ऐरे को वेक्टर में बदल सकते हैं - आपको कुछ गति में सुधार करना चाहिए। कोड पोस्ट करें और हम अधिक अनुकूलन का सुझाव देने में सक्षम हो सकते हैं।


0

मुझे लगता है कि आपकी मंदी है क्योंकि आप सभी पात्रों के लिए एक साथ पथ की गणना कर रहे हैं। एक वर्ण के लिए एक पथ की गणना तेज़ है लेकिन यदि दृश्य में दो दर्जन वर्ण हैं तो वह नीचे की ओर झुका सकता है।

इसके बजाय आपको कुछ फ़्रेमों पर लोड को फैलाना चाहिए। अपने AI अपडेट को स्टैगर करें ताकि विभिन्न अक्षर विभिन्न फ़्रेमों पर अपना पथ अपडेट करें। यह वास्तव में ध्यान देने योग्य होगा यदि एक चरित्र ने बाद में एक दूसरे तक प्रतिक्रिया नहीं की, लेकिन सिर्फ एक फ्रेम खराब प्रतिक्रियाओं का कारण नहीं है।


यह लगभग एक साल पहले उत्तर दिया गया था, और केवल ग्रेस के संपादन कार्य के कारण टकरा गया था। (इसका बहुत अधिक पात्रों से कोई लेना-देना नहीं था।)

मुझे बताने के लिए धन्यवाद। मैंने तारीखों पर ध्यान नहीं दिया।
झॉकिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.