पूरी तरह से गतिशील केडी-ट्री बनाम क्वाडट्री?


11

अपने खेल पर काम करना, मैं उस बिंदु पर हूं जहां मुझे दुनिया की सभी इकाइयों को ट्रैक करने की आवश्यकता है ताकि मैं मुकाबला करने के लिए निकटतम पड़ोसी जांच कर सकूं। यह एक आरटीएस जैसा खेल है, जिसमें संभावित रूप से हजारों छोटी स्वचालित इकाइयाँ चलती हैं।

मैं केडी-ट्रीज़ और क्वाडट्र्स (विशेष रूप से प्वाइंट क्वाडट्रैस) में देख रहा हूं। मैं अब भी यह जानने की कोशिश कर रहा हूं कि वे कैसे काम करते हैं, लेकिन अभी तक प्वाइंट क्वाडट्रिज मेरे लिए सबसे ज्यादा मायने रखते हैं। हालाँकि, मुझे यह आभास हो रहा है कि केडी-पेड़ खोज करने में तेज हैं, जो कि पेड़ में मेरे पास मौजूद अंकों की संख्या के साथ महत्वपूर्ण है।

दूसरी ओर, मेरे मामले में, मैं उन इकाइयों की एक विशाल संख्या पर नज़र रखने जा रहा हूं जो हमेशा चलती रहती हैं। फ्रेम से फ्रेम तक, उनकी स्थिति हमेशा अलग होगी। Quadtrees, केडी-पेड़ों की तुलना में जाहिरा तौर पर तेजी से असंतुलित होते हैं, लेकिन मुझे नहीं पता कि यह तब लागू होता है जब आप पेड़ के हर बिंदु को पुन: संतुलित कर रहे होते हैं ।

मैं सोच रहा हूं कि क्या इस मामले में बेहतर होगा कि पेड़ को प्रत्येक फ्रेम को स्क्रैप करें और इसे स्क्रैच से पुनर्निर्माण करें, बजाय पेड़ के हर एक बिंदु को पुन: संतुलित करने की कोशिश करें? अगर एक क्वाडट्री असंतुलन के लिए तेज है, तो इसका मतलब यह भी है कि यह खरोंच से निर्माण करने के लिए तेज है? यदि ऐसा है, तो केडी-ट्री की खोज गति की तुलना में प्रदर्शन के लिए यह अधिक महत्वपूर्ण हो सकता है, यह निर्भर करता है कि पेड़ बनाने के लिए कितना बोझ है, लेकिन मुझे नहीं पता ...

जवाबों:


12

केडी-पेड़ निश्चित रूप से गतिशील नहीं हैं, जिन्हें ईमानदारी से माना जाता है। कुछ इकाइयों को स्थानांतरित करने से आपको आसानी से पूरे केडी-ट्री के पुनर्निर्माण की आवश्यकता हो सकती है। प्लस, केडी-ट्री प्रश्नों के लिए बहुत कुशल है, लेकिन पड़ोसी खोज के लिए इतना नहीं।

एक चतुर्थांश समय के साथ अधिक लचीला होता है, क्योंकि संशोधन स्थानीय स्तर पर अधिक रखा जाता है। नुकसान यह है कि यदि आपके पास एक स्थान पर कई इकाइयाँ हैं जो अक्सर चलती हैं, तो यह बहुत अधिक उपखंड कर सकती है और इकाइयों की गति के कारण बहुत सारे अपडेट की आवश्यकता होती है। आप एक सीमा निर्धारित कर सकते हैं, जिसके तहत कोई भी उपखंड नहीं हो सकता है। लेकिन खबरदार, इसका मतलब है कि बहुत सारी इकाइयाँ संभवतः एक ही लीफ स्क्वायर में हो सकती हैं।

हालांकि अगर आप केवल एक निरंतर त्रिज्या r के भीतर सभी इकाइयों को खोजने में रुचि रखते हैं , तो आपको क्वाडट्री और केडी-ट्री की आवश्यकता नहीं है। आप बस लंबाई आर के पक्ष की कोशिकाओं का 2 डी सरणी बना सकते हैं और अपनी स्थिति के अनुसार प्रत्येक सेल में अपनी इकाइयों को ढेर कर सकते हैं। इस तरह, आपके पास खोज करने के लिए हमेशा सबसे खराब 9 कोशिकाएँ होती हैं। केवल अगर आपका नक्शा विशाल है , तो ऐसा ग्रिड लागू करने के लिए बहुत बड़ा होगा।

दो और पूरी तरह से अलग संरचनाएं हैं जिनके बारे में हमने नहीं कहा: पदानुक्रमित AABB और स्थानीय-संवेदनशील हैश तालिका। यदि प्रत्येक पदानुक्रमित AABB की उत्पत्ति को माता-पिता AABB के सापेक्ष वर्णित किया जाता है, तो इसका लाभ यह है कि यदि इकाई का एक बड़ा समूह अपना गठन रखता है, तो आपको छोटे AABB को अपडेट करने की आवश्यकता नहीं है क्योंकि वे समान सापेक्ष स्थिति रखते हैं। बेशक, गठन को घुमाने से कई अद्यतन हो सकते हैं, उस स्थिति में अन्य बाउंडिंग वॉल्यूम जैसे कि गोले या उन्मुख बाउंडिंग बॉक्स (OBB) का उपयोग अधिक कुशल हो सकता है।

स्थानीय-संवेदनशील हैश टेबल केवल अनुमानित समाधान देता है, इसलिए मैं उनके साथ परेशान नहीं होता।

मुझे क्या करना होगा ? मैं शायद एक साधारण ग्रिड के साथ शुरू करूँगा, और जब मुझे इसकी आवश्यकता होगी, मैं इसे क्वाडट्री में अपग्रेड करूंगा और अगर मुझे इसकी आवश्यकता है, तो मैं इसे कुछ सीमा के तहत एक बाउंडिंग वॉल्यूम पदानुक्रम के साथ जोड़ूंगा: क्वाडट्र्स एक बड़े स्तर पर अच्छी तरह से काम करते हैं स्केल, सापेक्ष बाउंडिंग वॉल्यूम छोटे पैमाने पर अच्छी तरह से काम करते हैं। इसे धीरे-धीरे करते हुए, मुझे तुरंत सर्वश्रेष्ठ डेटा संरचना प्राप्त करने के लिए शुरू से घंटे खर्च करने की आवश्यकता नहीं है ।


धन्यवाद! मैंने पदानुक्रमित AABB और स्थानीय-संवेदनशील हैश टेबल के बारे में नहीं सुना था, मैं उन्हें भविष्य के लिए देखूंगा। अभी के लिए मैं एक साधारण ग्रिड के साथ जा रहा हूँ और यदि आवश्यक हो तो विस्तार करेगा। :)
नायरौ

4

लॉरेन के सुझाव बहुत अच्छे हैं, लेकिन मैं AABBs के एक गतिशील बाउंडिंग वॉल्यूम ट्री का भी सुझाव दूंगा। वैचारिक रूप से गतिशील बाउंडिंग वॉल्यूम ट्री नोड्स का एक संतुलित पेड़ रखता है जिसे किसी AABB में पास करके और ओवरलैपिंग जोड़ी को पुनः प्राप्त करके पास के तत्वों के लिए किसी भी समय क्वियर किया जा सकता है। पेड़ हर फ्रेम का पुनर्निर्माण नहीं है। इसके बजाय प्रत्येक नोड के एएबीबी को पेड़ में डालते समय थोड़ा फुलाया जाता है, और जब भी नोड के वास्तविक एएबीबी को फुलाए गए एएबीबी में शामिल नहीं किया जाता है, तो पेड़ को फिर से बनाया जाता है। मैं इसे अपने भौतिकी इंजन में उपयोग करता हूं और यह बहुत अच्छा काम करता है।

Box2D स्रोत कोड का एक महान कार्यान्वयन है।

https://github.com/erincatto/Box2D/blob/master/Box2D/Box2D/Collision/b2DynamicTree.h

यहाँ उनके कार्यान्वयन की एक अच्छी समीक्षा है:

http://www.randygaul.net/2013/08/06/dynamic-aabb-tree/


हाँ, यह अधिक या कम है कि मुझे पदानुक्रमित AABB से क्या मतलब है, मैं बहुत सटीक नहीं था। ओह, और RTSes इकाई में अक्सर मोबाइल होते हैं, लेकिन संरचनाओं में। तो मूल AABB नोड के सापेक्ष निर्देशांक का उपयोग करना "मुद्रास्फीति" त्रुटि मार्जिन के साथ काफी कुशल हो सकता है।
21

क्या आप Google कोड लिंक अपडेट कर सकते हैं?
कोलेंडा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.