स्थानिक हैशिंग पर एक चतुर्थांश कब बेहतर है?


12

मैं एक ही समय में बहुत सारी वस्तुओं के साथ 2d platformer बना रहा हूं। वे सभी AABB टक्कर का पता लगा रहे हैं। मैंने पहले एक क्वाडट्री की जांच करने के लिए वस्तुओं की संख्या को कम करने की कोशिश की, कुछ अलग कॉन्फ़िगरेशन की कोशिश की, लेकिन यह उतना प्रभावी साबित नहीं हुआ जितना मुझे चाहिए था। मैंने एक स्थानिक हैश लागू किया और यह अधिक कुशल है, प्रत्येक टकराव की जांच करने के लिए वस्तुओं की संख्या में भारी गिरावट आई।

क्या एक मामला है जब द्विघात टक्कर का उपयोग करते हुए स्थानिक हैशिंग पर बेहतर है? मेरे परीक्षणों के अनुसार, ऐसा लगता है कि स्थानिक हैशिंग हमेशा कम वस्तुओं के साथ टकराव के लिए परीक्षण किया जाता है?

मैंने एल्गोरिदम पर टाइमिंग नहीं की है, लेकिन जब आप सी में कोडिंग करते हैं, तो हैशिंग को लागू करना बहुत महंगा या मुश्किल होता है? ध्यान देने योग्य बात यह है कि मैं गेम को जावास्क्रिप्ट में लिख रहा हूं, जहां आपके पास "मुफ्त में" हैशिंग है।

यहाँ तुलना है, क्या मैंने कुछ अनदेखी की? http://zufallsgenerator.github.io/2014/01/26/visually-comparing-algorithms/

जवाबों:


12

क्वाड ट्री का प्रमुख लाभ यह है कि यह आपको बहुत जल्दी विचार करने से बाल्टी के पूरे समूह को त्यागने की अनुमति देता है।

उदाहरण के लिए, मान लें कि मेरे पास छह स्तरों वाला एक चौकोर वृक्ष है। अपने निम्नतम स्तर पर, यह 32x32 बॉक्स है; 1024 बक्से जिसमें सबसे नीचे, सबसे विस्तृत स्तर होता है। तुलना के लिए, हम एक "स्थानिक हैश" पर भी विचार करेंगे - एक फ्लैट ग्रिड जिसमें 32x32 बॉक्स, कुल 1024 बॉक्स शामिल हैं। (क्वाड ट्री में कुल 1024 से अधिक बॉक्स होते हैं, क्योंकि इसमें उच्च स्तर पर भी बड़े बॉक्स होते हैं)

चलो मान लेते हैं कि सिस्टम में कोई ठोस वस्तुएं नहीं हैं - हमारे क्वाड ट्री और हमारे फ्लैट ग्रिड के सभी बक्से पूरी तरह से खाली हैं।

यदि आप किसी ऐसी चीज़ के टकराव का परीक्षण कर रहे हैं, जो इतनी बड़ी है कि उसका बाउंडिंग बॉक्स उन सभी बॉक्सों को काटता है, और आप एक फ्लैट ग्रिड का उपयोग कर रहे हैं, तो आपको यह देखने के लिए उन 1024 बॉक्सों में से हर एक को देखना होगा कि क्या उसमें भी कुछ है? उन्हें।

लेकिन अगर आप एक नेस्टेड क्वाड ट्री का उपयोग कर रहे हैं, तो सबसे ऊपरी स्तर आपको बता सकता है कि सिस्टम में कोई अन्य ऑब्जेक्ट नहीं हैं, और इसलिए आपको केवल यह जानने के लिए उस सिंगल बॉक्स को देखना होगा कि आप टकराव खोजने वाले नहीं हैं। पेड़ में गहरा - आप तुरंत परीक्षण रोक सकते हैं।

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

जिनमें से सभी का मतलब यह नहीं है कि पेड़ की संरचना हमेशा सही विकल्प है, निश्चित रूप से। फ्लैट ग्रिड आपके उदाहरण में आपके लिए मौजूद स्थिति के लिए आदर्श हैं - दुनिया में हर जगह समान रूप से फैली वस्तुओं के घने बादल, और हम सरल, सस्ती टक्कर परीक्षण कर रहे हैं। बिलकुल ग्रिड उस मामले में इष्टतम दृष्टिकोण होने की संभावना है!


5
बेहद आलसी के लिए लैकोनिक सारांश: क्वाडट्र्स अलग-अलग आकार की वस्तुओं को तेजी से संभालते हैं।
एको

धन्यवाद, यह एक उत्कृष्ट उत्तर है! वस्तुओं का एक समान आकार कुछ ऐसा था जिस पर मुझे संदेह था।
क्रिस

असल में, आपको आम तौर पर क्वाड ट्री के सभी स्तरों के माध्यम से यह जांचना होगा कि क्या आम तौर पर कोई ऑब्जेक्ट नहीं हैं, एक स्तर केवल उन वस्तुओं के बारे में जानकारी रखता है जो दोनों पूरी तरह से उस स्तर की सीमा के अंदर फिट होते हैं और निचले स्तर में फिट नहीं होते हैं।
Malthe

1
@malthe यदि आप एक चतुर्थ वृक्ष कार्यान्वयन का उपयोग करने पर जोर देते हैं जो इस तरह के प्रश्न से जल्दी बाहर नहीं निकल सकता है, तो इसके बजाय एक स्थानिक हिसार का उपयोग करें; आप स्मृति लागत का 33% बचा लेंगे, और आपको किसी भी तरह से इसका कोई लाभ नहीं मिल रहा होगा। या वैकल्पिक रूप से, आप अपनी सूक्ष्मतम शुद्धता को केवल एक स्मूदी में ढीला कर सकते हैं और एक क्वाड ट्री का उपयोग कर सकते हैं, जो जल्दी आउट हो सकता है, या तो प्रत्येक नोड अपने बच्चों में संस्थाओं की संख्या को ट्रैक कर सकता है, या फिर एक विरल क्वाडट्री का उपयोग करके या जैसे कि खाली नोड्स हैं। जब तक उन्हें ज़रूरत न हो, तब तक उन्हें पेड़ से उतारा नहीं जाएगा। वास्तव में। पांच साल से अधिक समय बाद।
ट्रेवर पॉवेल

@TrevorPowell बेशक, आप सही हैं। मैं सिर्फ आपकी गारंटी पर गिर गया कि आपको केवल एक ही बॉक्स देखना है। यह सिर्फ सच नहीं है क्योंकि आपको उन गणनाओं को आगे बढ़ाना होगा। जहाँ तक मैं बता सकता हूँ आप पेड़ से टकराते हुए ऊपर और नीचे पेड़ को पा सकते हैं।
Malthe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.