2 डी टाइल मानचित्र को संग्रहीत करने के लिए एक अच्छा फ्लैट फ़ाइल प्रारूप क्या है जो किसी भी दिशा में असीम रूप से बढ़ सकता है?


9

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

मानचित्र डेटा संग्रहीत करने का एक अच्छा तरीका क्या है, 0,0 मूल पर लंगर डाला गया है ताकि मानचित्र डेटा के एक आयताकार सबसेट को मानचित्र पर किसी भी बिंदु से जल्दी और कुशलता से लोड किया जा सके?

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

जवाबों:


7

मैं सैद्धांतिक रूप से अनंत मात्रा में डेटा के लिए एक फ्लैट फ़ाइल का उपयोग करने के खिलाफ सलाह दूंगा।

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

यदि आप कई फाइलों में अपना हिस्सा फैलाते हैं, तो (-110, 5000) पर चंक मिलना केवल "% APPDATA% / game / map / -110 / 5000.dat" (या कुछ अन्य फ़ाइल नाम, जो आप चाहते हैं, कहने की बात है) उन्हें संकुचित करना शुरू करें)। डेटाबेस को केवल एक क्वेरी की आवश्यकता होती है। यदि किसी चंक के पास कोई डेटा नहीं है, तो आप बस कुछ भी स्टोर नहीं कर सकते। एक भी फ्लैट फ़ाइल बल्ले से सही रैंडम एक्सेस की गति और सुविधा प्रदान नहीं करती है।

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

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


4

सबसे अधिक इस्तेमाल किया जाने वाला समाधान अक्सर बहुत सारी फाइलों में विभाजित हो जाता है, हालाँकि आपका प्रश्न केवल एक ही फाइल का अर्थ है। इसके लिए एकमात्र समझदार विकल्प (मेरी राय में) उस एकल फ़ाइल के अंदर एक बहुत ही सरल फ़ाइल सिस्टम का अनुकरण करना है। यह वास्तव में करने के लिए बहुत कठिन नहीं है, लेकिन अगर आप कर सकते हैं तो आपको वास्तव में कई फ़ाइलों का उपयोग करने पर विचार करना चाहिए।

यदि आपको एक फाइल से चिपके रहना है, तो आप ext2 fs से अपने कार्यान्वयन के लिए प्रेरणा पा सकते हैं। http://en.wikipedia.org/wiki/Ext2 मुझे पता है कि इससे मुझे कुछ अच्छे निर्णय लेने में मदद मिली जब मुझे एक गेम के लिए एक सरल एफएस लागू करना पड़ा।

लेकिन वास्तव में, किसी भी बढ़ते नक्शे के लिए, यह आमतौर पर प्रत्येक "एक्सेस" चंक के लिए एक फ़ाइल का उपयोग करना बेहतर होता है।


4

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

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

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


मैं आपको sqlite sqlite.org देखने का सुझाव दूंगा । यह बहुत स्व-निहित है, अनुक्रमित है, बूँदें संभालती है, आदि यह आपकी फ़ाइल में प्रदर्शन और पते "छेद" के साथ मदद करेगा।
डैनियल ब्लेज़ेक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.