लगता है जैसे आप पेड़ों के बारे में जानना चाह रहे हैं!
और मैं गंभीर हो रहा हूं, यदि आप वर्तमान में अपने सभी क्यूब्स की एक सरणी पर लूपिंग कर रहे हैं, तो आपको वास्तव में विभिन्न स्थानिक डेटा संरचनाओं में देखना चाहिए। इस मामले के लिए, अपनी घन दुनिया की फिर से कल्पना करने का सबसे अच्छा तरीका एक पेड़ है।
इससे पहले कि हम क्यों कारणों में जाते हैं, हमारी समस्या के बारे में सोचते हैं। हम एक ऐसे समाधान की तलाश कर रहे हैं, जहाँ तक संभव हो, कम लागत के लिए, हम पास के क्यूब्स की एक सूची पुनः प्राप्त कर सकते हैं जो खिलाड़ी के साथ टकरा सकती है। यह सूची यथासंभव छोटी, फिर भी सटीक होनी चाहिए।
अब इस क्षेत्र को निर्धारित करने के लिए, हमें अपने खिलाड़ी के समन्वय स्थान को घन मानचित्र के समन्वय स्थान पर मैप करने की आवश्यकता है; यही है, हमें खिलाड़ी के फ्लोटिंग पॉइंट पोजीशन को क्यूब्स के बहुआयामी सरणी के असतत इंडेक्स पर मैप करने की आवश्यकता है (उदाहरण नोटेशन हो सकता है world[31][31][31]
, यानी 64 * 64 * 64 बहुआयामी सरणी के लिए सटीक मध्य)।
हम केवल इसी असतत अनुक्रमण का उपयोग करते हुए आसपास के ब्लॉकों की गणना कर सकते हैं, शायद केवल पास के क्यूब्स का नमूना ले सकते हैं, लेकिन इसके लिए अभी भी निरंतर पुनर्गणना की आवश्यकता होती है, और किसी भी ऑब्जेक्ट के लिए अनुमति नहीं देता है जो प्लेसमेंट में असतत नहीं हैं (अर्थात क्यूब को मैप नहीं कर सकते हैं) नक्शा)।
आदर्श स्थिति बाल्टियों का एक समूह है, जिसमें हमारे घन मानचित्र के विशेष खंडों के लिए क्यूब्स के हमारे सेट होते हैं, जो समान रूप से विभाजित होते हैं ताकि आसपास के क्षेत्र को पुनर्गणना करने के बजाय, हम बस इन क्षेत्रों में और बाहर चले जाएं । किसी भी गैर-तुच्छ गणना के लिए, हमारे डेटा को इस तरह से पकड़ना सभी क्यूब्स को समाप्त कर सकता है, और केवल ये व्यक्तिगत सेट जो पास हैं।
सवाल यह है: हम इसे कैसे लागू करते हैं?
64 * 64 * 64 दुनिया के लिए, इसे 8 * 8 * 8 क्षेत्रों में तोड़ने की कल्पना करें । इसका मतलब यह है कि आपकी दुनिया में, आपके पास अक्ष (एक्स, वाई, जेड) प्रति 8 जोन होंगे। इन क्षेत्रों में से प्रत्येक में 8 क्यूब्स होंगे, इस नए सरलीकृत सूचकांक द्वारा आसानी से पुनर्प्राप्ति योग्य।
यदि आपको अपनी दुनिया के प्रत्येक क्यूब को पुन: व्यवस्थित करने के बजाय, पास के क्यूब्स के एक सेट पर एक ऑपरेशन करने की आवश्यकता है, तो आप मूल रूप से इन जोन पर पुनरावृति कर सकते हैं , मूल 64 * 64 * 64 (264144) से पुनरावृत्तियों की अधिकतम संख्या को तोड़ सकते हैं। सिर्फ 520 (8 * 8 * 8 + 8)।
अब ज़ोन की इस दुनिया से बाहर ज़ूम करें, और ज़ोन को बड़े सुपर-ज़ोन में रखें ; जिसमें प्रत्येक सुपर-जोन में 2 * 2 * 2 नियमित क्षेत्र होते हैं । जैसा कि आपकी दुनिया में वर्तमान में 512 (8 * 8 * 8) क्षेत्र हैं , हम 8 * 8 * 8 ज़ोन को 64 (4 * 4 * 4) सुपर-ज़ोन में 8 ज़ोन को 2 ज़ोन प्रति सुपर-ज़ोन से विभाजित करके तोड़ सकते हैं । ऊपर से एक ही तर्क को लागू करना, यह सुपर-ज़ोन को खोजने के लिए अधिकतम पुनरावृत्तियों को 512 से 8 तक तोड़ देगा ; और फिर कार्यवाही क्षेत्र खोजने के लिए अधिकतम 64(कुल अधिकतम 72)! आप देख सकते हैं कि यह आपको पहले से ही बहुत सारे पुनरावृत्तियों को कैसे बचा रहा है (262144: 72)।
मुझे यकीन है कि अब आप देख सकते हैं कि पेड़ कितने उपयोगी हैं। प्रत्येक ज़ोन पेड़ पर एक शाखा है, जिसमें प्रत्येक सुपर-ज़ोन एक पूर्ववर्ती शाखा के रूप में है। आप बस पेड़ की तलाश कर रहे हैं कि आपको क्या चाहिए; समग्र लागत को कम करने के लिए डेटा के छोटे सेट का उपयोग करना।
नीचे दिए गए चित्र आपको अवधारणा की कल्पना करने में मदद करेंगे। (चित्र विकिपीडिया से: अष्टक ):
अस्वीकरण:
ऊपर के रूप में स्थापित एक आदर्श में, जहां आपकी स्वर-दुनिया पहले से ही एक निश्चित आकार के बहुआयामी सरणी में रखी गई है, आप बस खिलाड़ी की स्थिति को क्वेरी कर सकते हैं, फिर एक ओ (1) लागत के साथ आसपास के ब्लॉकों को इंडेक्स कर सकते हैं! (ओल्होव्स्की स्पष्टीकरण देखें) लेकिन यह तब और मुश्किल हो जाता है जब आप यह विचार करना शुरू करते हैं कि आपकी दुनिया एक स्वर के खेल में शायद ही कभी निश्चित आकार की हो; और आपको HDD से मेमोरी तक पूरे सुपर-ज़ोन को लोड करने में सक्षम होने के लिए आपकी डेटा-संरचना की आवश्यकता हो सकती है । एक निश्चित आकार के बहु-आयामी सरणी के विपरीत, पेड़ आसानी से दहनशील एल्गोरिदम पर बहुत अधिक समय खर्च किए बिना अनुमति देते हैं।