2 डी स्थानिक विभाजन स्थानिक हैश और चतुष्कोण के विकल्प


11

मैं अपने खेल में एक स्थानिक विभाजन एल्गोरिथ्म को लागू करने की कोशिश कर रहा हूं, लेकिन दोनों स्थानिक हैश और क्वाडट्रीज़ मैं नहीं देख रहा हूं।

मेरे स्तर के आकार की सीमा नहीं है (केवल Int32 सीमा)। मुझे एक स्थानिक विभाजन एल्गोरिथ्म चाहिए जो "स्तर चौड़ाई" और "स्तर ऊंचाई" की आवश्यकता नहीं है।

मेरे पास बहुत सी भौतिक वस्तुएं हैं। मुझे 500+ ऑब्जेक्ट का समर्थन करने के लिए एल्गोरिथ्म को पर्याप्त तेज़ होना चाहिए।

कोई विकल्प?

जवाबों:


13

गतिशील वृक्ष

Box2D एक अच्छी तरह से अनुकूलित इंजन है जिसे एक अनुभवी भौतिकी / गेम प्रोग्रामर द्वारा डिज़ाइन किया गया है । मूल रूप से Box2D ने एक हैश ग्रिड का उपयोग किया था जिसे एक निश्चित ऊंचाई और चौड़ाई की आवश्यकता थी।

जब एरिन एक बेहतर ब्रॉडफेज़ एल्गोरिथ्म में उन्नत हुई तो वह नैथनेल प्रेसन के btDbvt के साथ गई। यह बुलेट भौतिकी द्वारा उपयोग किया जाने वाला ब्रॉडस्पेस है। एरिन ने 2 डी के लिए एल्गोरिदम को संशोधित और अनुकूलित किया।

आप बॉक्स 2 डी मैनुअल (.114.11, या डायनामिक ट्री की खोज) में एक उच्च उच्च स्तरीय ओवरव्यू पढ़ सकते हैं ।

यहां कोड दस्तावेज़ीकरण को छोड़कर (जो सार्वजनिक एपीआई का हिस्सा नहीं है, यह देखते हुए बहुत अच्छा है)।

एक गतिशील AABB ट्री ब्रॉड-फेज़, जो नथानेल प्रेसन के btDbvt से प्रेरित है। एक गतिशील पेड़ एक द्विआधारी वृक्ष में डेटा की व्यवस्था करता है ताकि वॉल्यूम प्रश्नों और किरणों जैसे प्रश्नों को तेज किया जा सके। पत्ते AABB के साथ समीप होते हैं। पेड़ में हम b2_fatAABBFactor द्वारा प्रॉक्सी AABB का विस्तार करते हैं ताकि प्रॉक्सी AABB क्लाइंट ऑब्जेक्ट से बड़ा हो। यह ट्री ऑब्जेक्ट को ट्रिगर किए बिना क्लाइंट ऑब्जेक्ट को छोटी मात्रा में स्थानांतरित करने की अनुमति देता है।

नोड्स को पूल किया जाता है और स्थानांतरित किया जाता है, इसलिए हम संकेत के बजाय नोड सूचकांकों का उपयोग करते हैं।

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

सभी कोड का सबसे अच्छा एमआईटी है इसलिए नकल / व्युत्पन्न / बेशर्मी-चोरी / आदि के लिए स्वतंत्र महसूस करें।


लगता है ... जटिल! मैं इस पर एक नज़र डालूँगा, हालाँकि। किसी ने मुझे "स्वीप एंड प्रून" या "सॉर्ट एंड स्वीप" तकनीक का उपयोग करने का सुझाव दिया, लेकिन मुझे C # या .NET कार्यान्वयन के बारे में कुछ भी नहीं मिला। मुझे एक c ++ उदाहरण मिला, लेकिन यह भ्रामक है और यह काम नहीं किया (मैंने इसे वैसे भी लागू करने की कोशिश की)। क्या आपको लगता है कि SAP को लागू करना आसान होगा? क्या .NET कार्यान्वयन हैं?
विटोरियो रोमियो

8

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

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

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


1

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


0

हो सकता है कि आर-ट्री एल्गोरिदम वह हो जो आप खोज रहे हैं।

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


मैंने एक C # कार्यान्वयन की कोशिश की, और "नई स्थिति में वस्तुओं को हटाने और जोड़ने" पर प्रदर्शन बहुत खराब था।
विटोरियो रोमियो

0

मैंने तय 2 डी ग्रिड के साथ जाने का फैसला किया है।

मैंने दो वीडियो बनाए हैं, जो मुझे गहराई से समझाते हैं कि मैंने उन्हें कैसे लागू किया है, और वर्तमान कार्यान्वयन मेरे GitHub पृष्ठ पर उपलब्ध है: https://github.com/SuperV1234/SSVSCollision

http://www.youtube.com/watch?v=7HY_SqqaoL4

http://www.youtube.com/watch?v=vYB37BDtHuQ

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