2009-05-22 26 views
14

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

मैं इस खेल को दुनिया के लिए कुछ विशेष चिंताओं ...

  • मैं एक बार में खेल दुनिया में संस्थाओं की एक बड़ी संख्या का उपयोग कर सकेंगे करने में सक्षम होना चाहते हैं। हालांकि, इकाइयों का एक% एक ही प्रकार की इकाइयों के साथ टकरा नहीं जाएगा। उदाहरण के लिए प्रोजेक्टाइल अन्य प्रोजेक्टाइल के साथ टकराव नहीं करेंगे।

  • मैं इकाई आकारों की एक बड़ी श्रृंखला का उपयोग करने में सक्षम होना चाहता हूं। मैं चाहता हूं कि छोटी इकाइयों और सबसे बड़े बीच के बीच बहुत बड़ा आकार अंतर हो।

  • गेम दुनिया में बहुत कम स्थिर या गैर-चलती इकाइयां हैं।

मैं क्या जवाब यहाँ में वर्णित करने के लिए कुछ इसी तरह का प्रयोग करने में रुचि है: Quadtree vs Red-Black tree for a game in C++?

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

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

मैं अधिकतर किसी भी अच्छे एल्गोरिदम या विचारों की तलाश में हूं जो संख्या टकराव का पता लगाने और बाधा से बचने की गणना को कम करने में मदद करेंगे।

उत्तर

2

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

कई त्वरण संरचनाएं (उदाहरण के लिए, एक अच्छा बीएसपी) स्थापित करने में कुछ समय लग सकता है और इस प्रकार तेजी से एनीमेशन के लिए आम तौर पर अनुचित होता है।

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

6

यदि मैं आप थे तो मैं एक साधारण बसपा (बाइनरी स्पेस विभाजन) पेड़ को लागू करके शुरू कर दूंगा। चूंकि आप 2 डी में काम कर रहे हैं, बाध्य बॉक्स चेक वास्तव में तेज़ हैं।CBspTree, CBspNode और CBspCut (वास्तव में जरूरत नहीं)

  1. CBspTree वर्ग CBspNode में से एक रूट नोड उदाहरण है
  2. CBspNode CBspCut का एक उदाहरण है
  3. CBspCut का प्रतीक है आप कैसे एक सेट में कटौती: आप मूल रूप से तीन वर्गों की जरूरत है दो अपमान सेट में। यह polymorphism (उदाहरण के लिए सीबीएसपीक्यूएक्स या सीबीएसपीटीयू या कुछ अन्य काटने लाइन) शुरू करके हल किया जा सकता है। CBspCut भी दो CBspNode

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

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

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

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

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

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

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

किसी प्रकार की आलसी विलय और विभाजन प्रणाली को पेश करके इसे टाला जा सकता है, यानी आपके पास गंदे झंडे या गिनती को संशोधित करना है। बैच किए जा सकने वाले सभी परिचालनों को बैच करें, यानी 10 वस्तुओं को स्थानांतरित करना और 5 डालना एक बैच हो सकता है।एक बार जब ऑपरेशन का बैच समाप्त हो जाता है, तो आप जांचते हैं कि पेड़ गंदा है और फिर आप आवश्यक विलय और/या विभाजित संचालन करते हैं।

कुछ टिप्पणियां पोस्ट करें यदि आप मुझे आगे बताना चाहते हैं।

चीयर्स!


संपादित

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

4

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

एक ट्रैक्टर पेड़ का उपयोग करें।

  • स्टोर दोनों शाखाओं में वस्तु, नीचे सभी तरह: वस्तुओं कि कई क्षेत्रों में मौजूद के लिए आप कुछ ही विकल्प हैं। सबकुछ पत्ती नोड्स में समाप्त होता है लेकिन आप अतिरिक्त पॉइंटर्स की एक बड़ी संख्या के साथ समाप्त हो सकते हैं। स्थैतिक चीजों के लिए उपयुक्त हो सकता है।

  • ज़ोन सीमा पर ऑब्जेक्ट को विभाजित करें और प्रत्येक भाग को अपने संबंधित स्थानों में डालें। बहुत दर्द पैदा करता है और बहुत सारी वस्तुओं के लिए अच्छी तरह परिभाषित नहीं है।

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

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

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

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

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

1

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

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

संबंधित मुद्दे