एक बड़े टाइल मानचित्र पर क्षेत्रों को 'ज़ोनिंग' करने के साथ-साथ काल कोठरी भी


10

मेरा खेल Minecraft की तरह एक नक्शा है, जिस तरह से यह pseudoinfinite और बेतरतीब ढंग से उत्पन्न होता है। तथा बड़ा। मान लें कि उपयोगकर्ता ने 1000x1000 क्षेत्र (यहां 2D) का पता लगाया है, इसलिए यह 1,000,000 टाइल है।

जाहिर है मैं यह सब मेमोरी में स्टोर करने में सक्षम नहीं होने जा रहा हूं। न ही मैं केवल 10 टाइल या जो कुछ भी त्रिज्या से बाहर की बात को अनदेखा करना चाहता हूं - दोनों कुछ भी अपडेट नहीं करेंगे (सभी एनपीसी, शायद प्रतिक्रियाशील टाइलें) और मुझे 1382,12918 जैसे अजीब पदों के साथ काम करना होगा।

इसलिए अगर मैं इसे नीचे या खंडों या 64x64 टाइलों में से जो भी कहूं, में विभाजित करना था, मुझे प्रत्येक टाइल और ऑब्जेक्ट की स्थिति को स्टोर करना होगा:

चंक ए, बी। स्थिति x, y।

लेकिन क्या होगा अगर मैं अपने नक्शे में काल कोठरी और पसंद करता हूं? तो एक भी टाइल जो शायद 40 मंजिल 40 के क्षेत्र के साथ प्रत्येक 40 मंजिल तहखाने की ओर जाता है। मैं ठीक उसी नक्शे में उन स्टोर नहीं कर सकते।

और स्मृति पक्ष है; मैं संभावित रूप से एक ही समय में मेमोरी में कितना स्टोर कर सकता हूं? मैं काफी आसानी से आईडी द्वारा टाइल्स कर सकता था, और वहां सामान्य 2 डी सरणी थी। या फिर, क्या टाइल प्रकारों की डेटा फ़ाइल होने की तुलना में अधिक प्रभावी समाधान है ? तो 64x64 के लिए..इसके लिए केवल 20K या जो भी हो। मैं सबसे यथार्थवादी अद्यतन के लिए लोड होने के लिए आसपास जितना संभव हो सकता हूं। लेकिन मुझे नहीं पता कि मैं मेमोरी हॉगिंग के बिना किस तरह की सीमाएं मार सकता हूं।

जवाबों:


9

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

आप वास्तव में यहां जो सोच रहे हैं वह एक विरल डेटा-सेट है: ऐसा कुछ जहां संभावित इंडेक्स बड़े (या असीमित) हैं, लेकिन केवल एक छोटा सा अनुपात वास्तव में उपयोग किया जाता है। मुख्य बिंदु यह है कि आप यह नहीं जानते कि किस अनुपात का उपयोग किया जाएगा।

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

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

अप्रत्यक्ष की अतिरिक्त परतों को पेश करके आप और भी अधिक भंडारण दक्षता प्राप्त कर सकते हैं। मान लें कि आप अपनी टाइलों को विखंडू में व्यवस्थित करते हैं, और विखंडू में 64x64x64 की ग्रैन्युलैरिटी है। 125, 1, 132 की टाइल को देखते हुए, आप जानते हैं कि यह चंक (1,0,2) में आता है। तो आपके पास एक दुनिया है, जिसमें एक कॉम्पैक्ट चंक सरणी है, और चंक इंडेक्स का एक मैट्रिक्स (-1 यदि चंक मौजूद नहीं है)। प्रत्येक चंक की सामग्री (यदि मौजूद है) एक 64x64x64 मैट्रिक्स के टाइल सूचक हैं (-1 यदि टाइल अभी तक मौजूद नहीं है), और उपयोग किए गए टाइल का एक कॉम्पैक्ट सरणी। इस तरह, आप विखंडू के लिए टाइल सूचकांकों का एक बड़ा हिस्सा नहीं जलाते हैं जो कभी उपयोग नहीं किए जाते हैं। इस प्रकार के दृष्टिकोण का पालन करके, और ग्रेन्युलैरिटी के लिए समझदार संख्याओं को उठाकर, आप अपने ब्रह्मांड को बड़े पैमाने पर बढ़ा सकते हैं, और अपनी मेमोरी के उपयोग को नियंत्रण में रख सकते हैं। दरअसल, अगर आप अपना हिस्सा 32x32x32 बनाते हैं,

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


मैं भविष्य में इस प्रश्न पर आने वाले किसी को भी सावधान करूंगा: जबकि इस पोस्ट में कुछ भी गलत नहीं है, यह ईमानदारी से Minecraft जैसे खेल के लिए भयानक है, जिसमें एक गैर-विरल दुनिया है। (और MrCranky जितना कहते हैं।) आपका दुनिया केवल इस से लाभ अगर यह कुछ somethings और के बहुत सारे है nothings , नहीं कुछ somethings और बहुत से खाली

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

1
क्या Minecraft अलग बनाता है कि प्रति इकाई लागत छोटी है - यह भंडारण का एक एकल बाइट हो सकता है? एक मान 'कुछ भी नहीं' इंगित करता है, बाकी ब्लॉक प्रकार हैं, और आप आसानी से एक बाइट में फिट हो सकते हैं। इसलिए आपके पास एक खंड के लिए एक सूचकांक नहीं होगा, यह सिर्फ पागल है, सूचकांक वास्तविक ब्लॉक मूल्य को संग्रहीत करने की तुलना में बहुत बड़ा है। लेकिन विरल डेटा सेट नियम अभी भी उच्च स्तर पर काम करते हैं। प्रत्येक चंक (उदाहरण 64x64x64) स्टोर करना (256K ब्लॉक) महंगा है, इसलिए यदि आप यह इंगित करने के लिए कि यह अनुपस्थित है, या इसका पता मौजूद है, तो आपने बड़े पैमाने पर भंडारण को सहेजा है।
श्री क्रानिके डिक

6

आप स्मृति में एक मिलियन टाइल क्यों नहीं जमा कर सकते हैं? यहां तक ​​कि मेरे फोन में 256MB रैम है; एक लाख खाली टाइल्स क्या हो रहा है, 4-32MB?


बस इतनी बड़ी संख्या में भंडारण होना प्रतीत हो रहा था। इसके साथ ही, उन्हें अपडेट करने में भी लंबा समय लगने वाला है।
कम्युनिस्ट बतख

2
अपडेट के लिए टाइल्स के एक सेट को अनदेखा करना बहुत आसान है, क्योंकि यह किसी प्रकार के डिस्क-पेजिंग समाधान से निपटने के लिए है। उन्हें अनदेखा कर दो। ज्ञात अभिनेता से X दूरी से अधिक टाइल अपडेट न करें।

2
@ TheCommunistDuck केवल एक चीज जो मायने रखती है वह है टाइलों को संग्रहीत करने के लिए उपयोग की जाने वाली मेमोरी की कुल मात्रा, न कि टाइल्स की संख्या।
जस्टिन

1
क्रैगन और जो के साथ सहमत। इस बारे में चिंता न करें कि बहुत कुछ कैसा लगता है - गणित करें और इसे पूरा करें। यह एक मुद्दा होने की संभावना नहीं है।
काइलोटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.