2009-05-09 17 views
12

मुझे इस प्रश्न का उत्तर यहां SO पर नहीं दिखाई देता है जो मुझे डरता है कि यह अविश्वसनीय रूप से सरल है और मुझे बस कुछ याद आ रहा है लेकिन यहां जाता है।गेम सहेजे गए सामग्री को कैसे प्रबंधित करते हैं?

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

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

/पृष्ठभूमि

मैं एक साथी है कि मनोरंजन के लिए खेल प्रणालियों को विकसित करने के लिए पसंद करती है। मैं अपने टेबल टॉप गेम्स में से एक लेने और एक्सएनए का उपयोग कर कंप्यूटर गेम में इसे बनाने की योजना बना रहा हूं।

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

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

या एनपीसी वार्ता का मामला। जब मैं व्यापारी # 853 में टक्कर डालता हूं तो वह यादृच्छिक रूप से 3 अलग-अलग अभिवादन में से एक को थूकता है।

ऐसे कुछ भी हैं जिन्हें मैं सोच सकता हूं लेकिन वे वास्तव में एक ही विषय पर भिन्नताएं हैं। यहां तक ​​कि उन दो उदाहरणों के साथ मुझे ऐसा लगता है कि एक ही मैकेनिक का उपयोग किया जा सकता है, लेकिन वह मैकेनिक क्या है?

मैं वर्षों से वेब विकास कर रहा हूं इसलिए मेरा दिमाग स्वचालित रूप से "डेटाबेस" पर कूदता है। डेटाबेस किसी भी समस्या का समाधान है। और मैं देख सकता हूं कि यह कैसे काम कर सकता है लेकिन ओवरहेड बहुत खड़ा लगता है। "यहां मेरा 6 एमबी संकलित गेम है ... ओह और 68 एमबी MySQL स्थापना।" या इससे भी बदतर है क्योंकि मैं एक्सएनए का उपयोग कर रहा हूं, शायद मुझे SQL सर्वर को बंडल करने का कोई तरीका ढूंढना होगा। :)

मैंने शायद एक्सएमएल सोचा लेकिन यह मेरे लिए भी सही नहीं लगता है। अगर मैं एक्सबॉक्स पर दौड़ना चाहता हूं तो यह कैसे काम करेगा? या ज़्यून? (जो मैं कर रहा हूं उसके लिए जरूरी नहीं है, लेकिन वहां कोई समाधान होना चाहिए जो उन्हें ध्यान में रखे।)

कोई भी रहस्य जानता है? या फिर कुछ विचार है?

धन्यवाद जेफ

उत्तर

6

एक दृष्टिकोण .net क्रमबद्धता का प्रयोग है।

सुनिश्चित करें कि आप की स्थिति पूरी तरह से जुड़ा हुआ ग्राफ है और उस ग्राफ में प्रत्येक वर्ग को सीरियलज़ेबल (सीरियलज़ेबलएट्रिब्यूट के साथ) के रूप में चिह्नित किया जाता है, बचत (और लोडिंग) के लिए आप सामान्य .net क्रमबद्धता का उपयोग कर सकते हैं।

आप यह देखने के लिए Project Xenocide (ओपन सोर्स एक्सएनए गेम) के लिए कोडबेस देख सकते हैं कि यह कैसा किया गया था।

+0

धन्यवाद ओडेड, मैं उस – JeffMc

+0

के माध्यम से खोदूँगा, मेरा सुझाव है कि आप सहेजें गेम स्क्रीन पर एक नज़र डालें और देखें कि प्रारंभिक बिंदु के रूप में क्या बचत होती है। – Oded

+0

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

0

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

5

आप SQLite.NET wrapper के साथ SQLite डेटाबेस का उपयोग कर सकते हैं। मैंने इसका इस्तेमाल किया है, और इसे काफी सरल पाया है। संपूर्ण डीएलएल केवल 850 केबी है, और डेटाबेस स्वयं ही एक फ़ाइल में बैठता है (आवश्यकतानुसार बनाई गई अस्थायी फ़ाइलों के साथ)। तो आपके उपयोगकर्ताओं को कोई समस्या नहीं होनी चाहिए।

लेकिन आप एक साधारण एक्सएमएल फ़ाइल, या घर से उगाए जाने वाले बाइनरी प्रारूप का भी उपयोग कर सकते हैं। यह सब इस बात पर निर्भर करता है कि आप डेटा से पूछताछ कैसे करेंगे, और कितना डेटा शामिल है। कोई जवाब नहीं है।

+0

यह एक्सबॉक्स या ज़्यून –

+0

पर पहले काम नहीं करेगा, उन्होंने कहा कि एक्सबॉक्स और ज़्यून आवश्यक नहीं है। दूसरा, SQLite (हालांकि शायद SQLite.NET नहीं) XBox के साथ उपयोग किया जा सकता है (देखें http://www.mail-archive.com/[email protected]/msg17898.html)। मैं ज़्यून के बारे में निश्चित रूप से नहीं जानता। –

+1

कई गेम अपने राज्य को बचाने के लिए SQLite का उपयोग करते हैं। यह भी मेरा पसंदीदा तरीका है। – gradbot

1

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

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

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

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

भले ही आप मनमाने ढंग से बचाने के बिंदुओं की अनुमति दें, आप किसी भी स्थान/स्तर की स्थिति को अनदेखा कर सकते हैं जिसे आप वापस नहीं कर सकते हैं। और आप शायद नहीं चाहते कि उपयोगकर्ता मध्य-कूद को बचा सके।

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

अधिकांश गेम अपने स्वयं के, बाइनरी, फ़ाइल स्वरूपों का उपयोग करते हैं। सबसे पहले यह नाटकीय रूप से भंडारण राशि को कम कर देता है। दूसरा, यह उपयोगकर्ताओं को सहेजने वाले गेम को मैन्युअल रूप से संपादित करके धोखा देने में मदद करता है - यदि आपके पास <health value="10"/> जैसे एक्सएमएल है तो <health value="100"/> पढ़ने के लिए फ़ाइल को संपादित करना बहुत आसान है। बाइनरी का नकारात्मक पक्ष यह है कि डीबगिंग के लिए यह बहुत मुश्किल है।

+1

मुझे लगता है कि Fallout 3 saves 3mb की तरह हैं ... जो मैंने कभी देखा है सबसे बड़ा है। लेकिन वे * सबकुछ * स्टोर करते हैं। हर व्यक्ति जिसे आप कभी मारते हैं, और जो भी वस्तु आप कभी भी छोड़ते हैं वह वहां हमेशा के लिए बैठेगी। अन्य खेलों में, शरीर 10 सेकंड के भीतर गायब हो जाता है ... पागलपन! लेकिन विषय से बाहर रास्ता: डी – mpen

+0

आप वास्तव में छोटे आकार के खेल को बचाने के सामान्यीकृत नहीं कर सकते हैं। जैसा कि @ मार्क ने उल्लेख किया है, फॉलआउट 3 (और एक ही इंजन पर चल रहे विलोपन) जैसे गेम वास्तव में बहुत सी चीजें बचाते हैं। यह तब महत्वपूर्ण हो जाता है कि इंजन एक कुशल भंडारण तंत्र का उपयोग करता है। –

+0

लेकिन यदि 3 एमबी एक गेम के लिए "बहुत" है, तो यह बहुत अच्छा है क्योंकि 3 एमबी वास्तव में मेमोरी या डिस्क में बिल्कुल ज्यादा जगह नहीं है। वेब ब्राउज़र कैश इस आकार में कम से कम 10 गुना हैं। जैसे मैंने कहा, यदि आप पिछले स्तर पर वापस जाने में सक्षम नहीं होने के नियमों को लागू करते हैं, तो आप अपने भंडारण को अगले कुछ भी नहीं कर देते हैं। – DisgruntledGoat

2

जैसा कि अन्य ने ध्यान दिया है, क्रमबद्धता जाने का तरीका है। और Gamasutra ने अभी data baking पर एक लेख प्रकाशित किया।

+0

धन्यवाद, मैं उस लेख को देख लूंगा। – JeffMc

+0

मुझे निश्चित रूप से नहीं लगता कि स्वत: क्रमबद्धता ही जाने का एकमात्र तरीका है। यह .NET ढांचे में कसकर बाधा डालता है (क्या होगा यदि आप इसे बाद में किसी अन्य चीज़ पर पोर्ट करना चाहते हैं?), और आपको अपने प्रारूप पर कम नियंत्रण देता है। इसमें कुछ अनावश्यक डेटा भी शामिल है। –

+0

@ मैथ्यू: यदि आप डेटा प्रारूप के बारे में बात कर रहे हैं जो प्लेटफॉर्म के बीच अंतर-परिवर्तनीय है, तो यह अधिक कठिन है। लेकिन अगर यह कोई मुद्दा है, तो .NET का उपयोग करना शायद सबसे अच्छा विचार नहीं हो सकता है। –

8

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

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

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

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

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

संबंधित मुद्दे