डेटा कैसे संग्रहित करें?


25

एक आदमी को एक मछली दें और आप उसे एक दिन के लिए खिलाएं। एक आदमी को मछली सिखाना और आप उसे जीवन भर के लिए खिला देना। - चीनी कहावत

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

इसलिए, जब तक मैंने अपने गैर-गेम प्रोजेक्ट पर डेटा स्टोर करने के लिए दो तरीकों का इस्तेमाल किया: XML फाइलें और रिलेशनल डेटाबेस। मुझे पता है कि NoSQL तरह का एक अन्य डेटाबेस भी है । हालाँकि मुझे नहीं पता होगा कि मेरे पास अधिक विकल्प उपलब्ध हैं, या पहली जगह कैसे चुननी है, एक तरफ मनमाना उठा।

तो सवाल निम्नलिखित है: मुझे किसी गेम प्रोजेक्ट के लिए किस तरह का डेटा स्टोरेज चुनना चाहिए?

और मुझे चुनने पर निम्नलिखित कसौटी पर दिलचस्पी होगी:

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

EDIT मुझे पता है कि गेम सामग्री को संग्रहीत करने के लिए XML / JSON / पाठ या डेटाबेस का उपयोग करना बेहतर होगा? , लेकिन लगा कि यह बिल्कुल मेरी बात नहीं है। अब अगर मैं गलत हूं, तो मुझे ख़ुशी होगी कि मेरे तरीकों में त्रुटि दिखाई देगी।

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


मैं जानना चाहूंगा कि मुझे डाउन-वोट क्यों मिलता है? क्या मेरा प्रश्न बहुत व्यापक है? विषय से परे? क्या अतिरिक्त जानकारी की आवश्यकता है?
एल्ड्रोस

मैं नीच नहीं हूं। लेकिन कृपया, इस पर कई बार चर्चा हुई। खोज क्षेत्र आज़माने के बारे में कैसे? इसने मुझे इसमें शामिल किया: gamedev.stackexchange.com/questions/4666/…
Notabene

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

अन्यथा, मैं यह जानना चाहूंगा कि मुझे स्पष्ट करने के लिए क्या बदलना चाहिए यह एक और सवाल है।
एल्डरोस

@ नोट: उदाहरण के लिए, मुझे यकीन है कि एक ऐसा परिदृश्य है जहां बाहरी डेटा भंडारण का उपयोग नहीं किया जाता है, लेकिन इसके बजाय डेटा "कोड" में संग्रहीत किया जाएगा ।
एल्डरोस

जवाबों:


21

आपका प्रश्न वास्तव में व्यापक है क्योंकि वहाँ शैलियों की सरासर संख्या के कारण, लेकिन यहाँ एक पेशेवर सॉफ़्टवेयर डेवलपर का दृष्टिकोण है।

आपने उन मानदंडों की एक सूची प्रदान की, जिनका उपयोग आप यह निर्धारित करने के लिए करना चाहते हैं कि कौन सा डेटा दृढ़ता तंत्र आप उपयोग करते हैं। वो थे:

  • परियोजना का आकार।
  • मंच खेल द्वारा लक्षित है।
  • डेटा संरचना की जटिलता।
  • कई परियोजना के बीच डेटा की पोर्टेबिलिटी।
  • डेटा को कितनी बार एक्सेस किया जाना चाहिए
  • एक ही एप्लिकेशन के लिए कई प्रकार के डेटा
  • कोई भी अन्य बिंदु जो आपको लगता है कि ब्याज का उपयोग करने का निर्णय लेते समय है।

पहले हमें यह स्थापित करने की आवश्यकता है कि कौन से विकल्प हमारे लिए उपलब्ध हैं। चूँकि आपने कोई भाषा या तकनीक निर्दिष्ट नहीं की है, यह ठीक-ठीक कहना कठिन है, लेकिन आप शायद XML और संबंधपरक डेटाबेस संग्रहण के बीच निर्णय लेने का प्रयास कर रहे हैं ।

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

फ्लैट फ़ाइलों के लिए:

  • एक्सएमएल
  • JSON
  • YAML
  • XAML
  • सादे पाठ

डेटाबेस के लिए:

  • एस क्यू एल सर्वर
  • माई एसक्यूएल
  • डीबी 2
  • आकाशवाणी
  • बहुत अधिक

संपादित करें: आपने फ़ाइलों और संबंधपरक डेटाबेसों से अलग अन्य प्रकार के तंत्रों के बारे में पूछा। केवल अन्य उल्लेखनीय प्रकार के डेटाबेस जो मैंने नियमित रूप से उपयोग किए हैं, वे "बर्कले-स्टाइल" डेटाबेस हैं, जो अनिवार्य रूप से कुंजी-मूल्य आधारित हैं। ये B- पेड़ों का उपयोग डेटा संरचना के लिए करते हैं ताकि लुकअप तेजी से हो। ये कॉन्फ़िगरेशन / सेटिंग लुकअप के लिए बहुत अच्छे हैं जहाँ आप जानते हैं कि आप क्या चाहते हैं (उदाहरण के लिए, मुझे "लेवल 1" के लिए सभी टेलीमेट्री डेटा दें)।

अब जब हमारे पास सभी मूल बातें हैं, तो आइए, हम आपके कुछ मानदंडों को छूते हैं।

परियोजना का आकार।

कुछ असहमत हो सकते हैं, लेकिन जरूरी नहीं कि आपकी परियोजना का आकार आपके डेटा दृढ़ता तंत्र पर भारी प्रभाव डाले। आप उन कार्यों के पुन: प्रयोज्य पुस्तकालय का निर्माण करना चाहेंगे, जो भी आप चाहते हैं कि तंत्र से डेटा संग्रहीत / लोड करें। मैं एक अमूर्त परत ( एडॉप्टर पैटर्न की जांच करना ) को लागू करने का भी सुझाव दूंगा ताकि जरूरत पड़ने पर आप अपने हठ तंत्र को आसानी से बदल सकें।

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

मंच खेल द्वारा लक्षित है।

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

डेटा संरचना की जटिलता।

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

कई परियोजना के बीच डेटा की पोर्टेबिलिटी।

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

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

डेटा को कितनी बार एक्सेस किया जाना चाहिए

जब तक आपके पास किसी तरह का कैशिंग मैकेनिज्म नहीं है, तब तक बहुत सारे डेटा एक्सेस का अर्थ I / O है। डेटाबेस स्मृति में संरचनाएं रखते हैं और डेटा हेरफेर और पुनर्प्राप्ति के लिए महान हैं। यदि आप वास्तव में लगातार डेटा जारी कर रहे हैं, तो आप डेटाबेस के साथ रहना चाह सकते हैं।

एक ही एप्लिकेशन के लिए कई प्रकार के डेटा

वॉल्यूम निश्चित रूप से एक विचार है, लेकिन जब तक आप हजारों या लाखों वस्तुओं को जारी रखने के बारे में बात नहीं कर रहे हैं, तब भी फ़ाइल सिस्टम समाधान के रूप में स्वीकार्य होगा।

खेल का प्रकार

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

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

EDIT: कुछ समय ऐसे होते हैं जहां हाइब्रिड दृष्टिकोण लेने से बहुत फायदा होता है। उदाहरण के लिए, मान लें कि आप एक MMORPG विकसित कर रहे हैं। क्लाइंट की तरफ, आप अन्य खिलाड़ियों के बारे में कैश्ड डेटा को गैर-रिलेशनल डेटाबेस में संग्रहीत कर सकते हैं (जैसा कि ऊपर बताया गया है)। सर्वर की ओर, आप इसे जारी रखने के लिए एक रिलेशनल डेटाबेस में सभी गेम डेटा को स्टोर कर रहे हैं। और फिर ग्राहक की ओर से आप शायद एक्सएमएल / फ्लैट फ़ाइलों में लॉग डेटा, कॉन्फ़िगरेशन डेटा, आदि का उपयोग कर रहे हैं।

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


+1 महान जवाब, और मैं पहले से ही इससे बहुत कुछ सीखता हूं। इसलिए मैं ऐसा करने से नफरत करता हूं, लेकिन कुछ बिंदु हैं, जिन्हें ठीक से संबोधित नहीं किया गया था। और यह शायद सबसे अधिक है क्योंकि मैं उन्हें पर्याप्त रूप से पर्याप्त रूप से व्यक्त नहीं कर सका। 1) मामूली बिंदु, लेकिन जब मैं मंच के बारे में बात कर रहा था, तो मैं वास्तव में विकास मंच के बारे में बात कर रहा था। लेकिन आपने इस बिंदु को वैसे भी संबोधित किया। 2) पोर्टेबिलिटी के द्वारा, मेरा मतलब पुन: प्रयोज्य है, लेकिन पोर्टेबिलिटी पर आपकी बात वास्तव में एक ऐसा बिंदु था जिस पर मैंने विचार नहीं किया था, लेकिन इसने खुद को काफी प्रासंगिक बताया। (-> जारी)
एल्डरोस

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

Updated..hope आपके सवालों को संबोधित करता है। :)
एड अल्टोफ़र

1

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

मैं जो कर रहा हूं वह डेटाबेस में जॅक्सन एन्कोडेड डेटा और एक रैपर का उपयोग कर रहा है जो डेटा को जंज़ में परिवर्तित करता है और जब भी जरूरत होती है तब वापस करता है। इसलिए डेटाबेस में एक मूल चरित्र प्रोफ़ाइल इस तरह दिख सकती है:

{"char_id":24,"char_name":"tchalvak","level":43,"profile":"Some profile here."}

Json डेटाबेस में अभी भी अच्छी तरह से पठनीय है, इसलिए यदि आप sql के साथ धातु के लिए नंगे काम कर रहे हैं और कभी-कभी सीधे डेटाबेस तक भी पहुँच प्राप्त करते हैं, तो यदि आप चाहें तो यह मैन्युअल रूप से परिवर्तनीय है।

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


0

आरटीएस जीन में, गेम डेटा को फ़ाइलों में संग्रहीत किया गया है।

इकाइयों और विशेषताओं को आईएनआई या एक्सएमएल फाइलों या अन्य पाठ-आधारित प्रारूपों में संग्रहित किया गया है, और मॉडल बाइनरी या यहां तक ​​कि पाठ-आधारित प्रारूपों और पाठ और ध्वनियों और मुख्यधारा के स्वरूपों में अन्य मीडिया का मिश्रण रहे हैं। कभी-कभी यह एक कंटेनर में होता है जिसमें क्रूड एन्क्रिप्शन होता है - वेस्टवुड का मिक्स फॉर्मेट दिमाग में आता है। लेकिन यह ज्यादातर आपत्तिजनक है - यदि आप उनके अंदर देखते हैं, तो वे प्रारूप को संभालने के लिए आसान में सिर्फ सामान्य फाइलें हैं।

ऑनलाइन खेल के आगमन के साथ यह गेम डेटा के लिए इंटरनेट पर पोस्ट-इंस्टॉलेशन का प्रावधान करने के लिए तेजी से आम हो गया है, हालांकि अक्सर यह अभी भी फाइलसिस्टम पर संग्रहीत है।


यह "ऐ युद्ध" (वेबसाइट डाउन एटम) में ऐसा नहीं है। वह एआई के लिए एक संबंधपरक डेटाबेस का उपयोग करता है जो व्यवहार का निर्णय लेते समय लिनक प्रश्नों को करने में सक्षम हो।
नैलर

0

डेटा संग्रहण की एक विधि का उपयोग क्यों करें?

ज्यादातर मामलों में, आप जिस गेम को दुनिया को जारी करते हैं, उसे उसी डेटा स्टोरेज फंक्शनलिटी की जरूरत नहीं होती, जो गेम को डेवलपमेंट के दौरान चाहिए होती है।

यहाँ कुछ रिलीज / विकास आवश्यकताओं की तुलना है: -

Requirement      |  Release  |  Development  |  QA
==================================================
Multi user       |    No     |      Yes      |  No
Writable         |    No     |      Yes      |  No
Revision Control |    No     |      Yes      | Yes (but only reading)
Compact          |   Yes     |       No      |  No
Fast             |   Yes     |       No      |  No

आदर्श रूप से, आप अपने डेटा लोडिंग मॉड्यूल में एक इंटरफ़ेस को परिभाषित करेंगे और फिर विशिष्ट आवश्यकताओं के अनुरूप कई संस्करण बनाएंगे।

एक परियोजना पर मैंने कई साल पहले काम किया था, सीडी से लोडिंग स्तर का डेटा बहुत दूर तक ले जा रहा था (बंद एचडी या तो महान नहीं था)। तो मैं निम्नलिखित के साथ आया। स्तर डेटा लोड करने के लिए मेरे पास तीन तरीके थे: -

  1. सामान्य लोडिंग - विकास के समय के लिए जब संपत्ति बदल रही थी
  2. पूर्व-रिलीज़ - प्रभावी रूप से सामान्य डेटा को फास्ट लोडिंग डेटा में बदलने की एक विधि
  3. रिलीज़ - केवल तेज़ डेटा (संपादन योग्य नहीं)

इसने लोडिंग समय को मिनटों से सेकंड तक कम कर दिया।

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