क्या XML / JSON / पाठ या गेम सामग्री को संग्रहीत करने के लिए डेटाबेस का उपयोग करना बेहतर होगा?


29

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

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

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

तो सवाल: कौन सा बेहतर तरीका है? मैं डीबी की ओर झुक रहा हूं, लेकिन मैं यह जानना चाहता हूं कि क्या टेक्स्ट फाइलों में छिपे नुकसान या वास्तविक मजबूत फायदे हैं। या अगर इन के अलावा अन्य विकल्प भी हैं (मुझे लगता है कि द्विआधारी प्रारूप के लिए serialize?)

जवाबों:


18

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


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

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

1
वह कैसे मदद करेगा? एक कस्टम एडिटर का उपयोग करना और फिर टेक्स्ट फ़ाइलों में आउटपुट करना वास्तव में आपको प्रत्येक विकल्प का सबसे खराब भाग देता है :-P
कोडरंगर

7

JSON बहुत हल्का और समझने में आसान है। मुझे लगता है कि यह एक खेल के लिए बेहतर अनुकूल है। cJSON वास्तव में अच्छा है। यह आपके स्रोत में उसी तरह शामिल होगा जैसे SQLlite करता है।

एक्सएमएल फाइलें उपयोगकर्ताओं के लिए संपादित करने के लिए कठिन हैं जितना आप सोच सकते हैं। यदि आप उस मार्ग पर जाते हैं, तो आप लोगों के लिए एक संपादक बनाना चाह सकते हैं ताकि वे आम नुकसान से बचने में मदद कर सकें।


मैंने वास्तव में JSON को कभी नहीं देखा है, जैसा कि मैं XML से खुश था (वास्तव में यह कितना आसान हो सकता है) .. पता चलता है कि JSON बहुत अद्भुत है ... लेकिन XML की तरह यकीन नहीं है कि अगर यह बहुत था तो कैसे काम करेगा? डेटा भारी
Spooks

7

यहाँ पार्टी के लिए देर हो रही है लेकिन मैंने इस पर शोध करने के लिए बहुत समय बिताया है।

पहले मैं निम्नलिखित का उपयोग क्यों नहीं करता:

XML: अत्यधिक क्रिया। अतिरेक के टन। क्षेत्र के नाम दोहरा रहे हैं? कुल

JSON: मुझे लगता है कि JSON UI लेआउट के लिए बहुत अच्छा है, लेकिन एक डेटाबेस के लिए, नर्क नं। इसमें XML, अतिरेक और गहरी नेस्टिंग जैसी समस्याएं होंगी। कुल।

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

अंत में, यहां वह समाधान है जिसका मैंने उपयोग करने का विकल्प चुना (और मुझे यह पसंद है)।

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

आप Microsoft Excel का उपयोग कर सकते हैं, लेकिन हर बार आपको बचाने के लिए इन बेवकूफ चेतावनियों को बाहर निकालता है। आप इसे ओवरराइड करने के लिए मैक्रोज़ का उपयोग कर सकते हैं, लेकिन मैं कहता हूं कि खुद को परेशानी से बचाएं और लिबरऑफिस प्राप्त करें । इसका नि: शुल्क, CSV संपादन का समर्थन करता है, और जब आप फ़ाइल खोलते हैं तो यह नाम से मेल खाने के लिए कॉलम की चौड़ाई को लोड करता है (Excel doesnt ऐसा करता है और इसने मुझे पागल कर दिया)।

फिर आपको बस अपने खेल में CSV फ़ाइलों को पार्स करने की आवश्यकता है। मैं एकता का उपयोग करता हूं इसलिए मुझे केवल इतना करना चाहिए कि मैं इस निफ्टी सी # सीएसवी पार्सर का उपयोग कर पाया:

सीएसवी पार्सर उदाहरण

आप CSV फ़ाइलों को अपने गेम डेटा ऑब्जेक्ट में परिवर्तित करते हैं और आप जाने के लिए अच्छे हैं। एकता के साथ आप इन्हें ScriptableObjects में बदल सकते हैं । तो मेरा वर्कफ़्लो है: CSV अपडेट करें -> स्क्रिप्ट योग्य ऑब्जेक्ट में CSV पार्स करें -> मेरे गेम के लिए ScriptableObjects से डेटा का उपयोग करें


6

इसका उत्तर इस बात पर निर्भर करता है कि आप खेल के लिए किस भाषा का उपयोग कर रहे हैं।

यदि आप C ++ का उपयोग कर रहे हैं, तो आपको मौजूदा XML लाइब्रेरीज़ (जैसे TinyXml या ekpat ) में से एक का उपयोग करने की सलाह दी जाएगी ।

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

JSON बहुत गति प्राप्त कर रहा है और निश्चित रूप से सबसे अच्छा विकल्प है यदि आपका आवेदन एक से अधिक भाषाओं का उपयोग करके लिखा गया है।

संक्षेप में, यह इस बात पर निर्भर करता है कि आपकी भाषा में आसानी से उपयोग योग्य क्या है।


1
C ++ से किसी भी DB का उपयोग करने के लिए क्या समस्या है?
बुद्ध

2

यदि आप उन चीजों के XML दायरे में रहना चाहते हैं जो लोड प्रदर्शन को बढ़ाने में मदद करने के लिए आप बाइनरी XML का उपयोग कर सकते हैं ।

उदाहरण के लिए फास्ट इन्फोसिट बाइनरी एक्सएमएल का कार्यान्वयन है

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


हालांकि शायद कुछ ऐसा नहीं होगा जिसका मैं उपयोग करूंगा (मैं XML पर JSON की ओर झुकाव कर रहा हूं) मैं लिंक की सराहना करता हूं।
कोडेक्सआर्कनम

1

मैं डेटाबेस डिजाइन कर रहा हूं और अब सालों से कई गेम आइडिया के साथ खेल रहा हूं। इस समय मेरा व्यक्तिगत पसंदीदा, कुछ थोड़े बनावट वाला, विन्यास के लिए मानव-पठनीय प्रारूप है, लेकिन फिर इन "धीमी लिपियों" को कुछ और अधिक चल सकने योग्य बनाता है। बहुत कुछ जेएवीए और .NET रन-टाइम बायटेकोड में संकलित है।

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

यदि इसके बारे में "असीमित हार्डड्राइव स्पेस" है, तो ड्रॉपबॉक्स या अमेज़ॅन एस 3 जैसे कुछ पर साइन अप करें और उनके साथ सिंक करें।

इसलिए मेरे लिए योजना वर्तमान में है:

  1. कॉन्फ़िगर / स्क्रिप्ट / xml (कुछ मानव पठनीय प्रारूप) टेक्स्टफाइल्स के रूप में (सोर्सकोड की तरह)
  2. पार्सर / सत्यापनकर्ता जो नई स्क्रिप्ट के माध्यम से चलता है और जांचता है कि वे नियमों का पालन कर रहे हैं
  3. कंपाइलर जो बाइनरी या एसक्यूएल-पंक्ति को मूल फाइलों से बाहर कर देता है, ताकि ये तेजी से फिर से चलें और तेजी से चलें।

स्थिरता के बारे में, मैं वर्तमान में कई स्थानों के बीच "सह-स्थान होस्ट" और ऑटोसिंक होने के लिए डेटाबेस का निर्माण कर रहा हूं, ताकि यदि कोई नेटवर्क / हार्डवेयर विफलता एक स्थान पर हो, तो अन्य साइटों को समान ट्रैफ़िक को संभालने में सक्षम होना चाहिए / gamestates।


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

1

यदि आप काउचडब का उपयोग करते हैं तो आप अनिवार्य रूप से JSON संरचना के रूप में सब कुछ बचा लेंगे। Couchdb आपके (एकाधिक) उपयोगकर्ता के डेटा को कम या ज्यादा दर्द रहित तरीके से दोहराने का ध्यान रखेगा।


0

आप PHP, MySQL और C # / जावास्क्रिप्ट के साथ यूनिटी विकी में एक प्रक्रिया पा सकते हैं , और यह अपने उद्देश्य के लिए ठीक काम करता है।

इसमें तीन चरण होते हैं

  1. एक रिक्त MySQL डेटाबेस और एक तालिका बनाएँ।
  2. एक PHP सर्वर साइड स्क्रिप्ट बनाएं (यह MySQL टेबल से कनेक्ट होगा, एक एकता स्क्रिप्ट (चरण 3) से डेटा प्राप्त करेगा, और डेटाबेस क्वेरी करेगा (दिए गए उदाहरण या तो डेटा सम्मिलित कर रहे हैं या चयन कर रहे हैं))
  3. एकता नियंत्रक स्क्रिप्ट बनाएं (यह चरण 2 में बनाई गई PHP स्क्रिप्ट से कनेक्ट होगा)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.