संपत्ति को बचाते समय मैं परिवर्तनों को कैसे संभाल सकता हूं?


9

मैं थोड़ी देर के लिए एक आरपीजी पर काम कर रहा हूं और मैं दो अलग-अलग क्रमांकन तकनीकों का उपयोग करता हूं।

  • दुश्मन, हथियार, आइटम XML के रूप में सहेजे जाते हैं।
  • नक्शे और घटनाओं को "नियंत्रित बाइनरी" के रूप में सहेजा जाता है (हर वर्ग को एक बचत / लोड विधि मिलती है और वे तय करते हैं कि वे क्या सहेजना / लोड करना चाहते हैं)।

लेकिन मैंने नक्शे और घटनाओं के लिए अपनी पसंद पर सवाल उठाना शुरू कर दिया है। मेरी चिंताएँ:

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

मेरी तकनीक को बदले बिना पहली चिंता करना मुश्किल है। मैंने JSON में बदलने के बारे में सोचा, लेकिन यह बहुत काम की बात है। मुझे यह भी लगता है कि यह हर जगह [DataContract] और [DataMember] विशेषताओं के साथ बहुत बदसूरत दिखता है।

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

जवाबों:


5

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

मुझे "परिवर्तनों का वर्णन" दृष्टिकोण पसंद है, लेकिन यह पता लगाएं कि विशेषताओं के माध्यम से इसे करने की कोशिश करना बहुत जल्दी हो जाता है । मैं इसके बजाय कार्यों का उपयोग करूँगा; एक फ़ंक्शन लागू करें जो आपके सभी उपयुक्त संस्करण के लिए Nसंस्करण में डेटा को संस्करण में परिवर्तित करता है N + 1। लोड होने पर, नवीनतम के खिलाफ संस्करण की जांच करें और यदि ऐसा नहीं है, तो सभी उपयुक्त संस्करण कार्यों के माध्यम से डेटा चलाएं। हमेशा नवीनतम संस्करण को बचाएं।

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

विकास के दौरान जब आप अपने डेटा पर पुनरावृत्ति करते हैं तो यह स्वाभाविक रूप से नवीनतम संस्करण तक फैल जाएगा और आप अंततः पुराने संस्करण के कार्यों को हटा सकते हैं। यह कमोबेश एक ही उच्च-स्तरीय दृष्टिकोण है जिसका उपयोग हम गिल्ड वॉर्स 2 में कला संपत्ति (जैसे कि नक्शे) के रूप में करने के लिए करते थे।


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

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


टिप्पणी के लिए धन्यवाद, मुझे कुछ विचार दिए कि कैसे जारी रखा जाए।
user1776562 17

1

XML या JSON जैसी विशेषता-मूल्य जोड़े वाली मार्कअप भाषा का उपयोग करें।

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

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

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

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


1

आप प्रोटोबुफ़ का उपयोग कर सकते हैं। https://code.google.com/p/protobuf/ यह आपको json / xml के फायदे देता है, कि आप इसे पीछे की ओर संगत करते हुए, बाइनरी होने के लाभ के साथ आसानी से बढ़ा सकते हैं। वर्कफ़्लो है, कि आप प्रोटोबॉफ़ भाषा में डेटा प्रारूप विवरण बनाते हैं और फिर क्रमांकन और डीरिएलाइज़ेशन के लिए स्रोत कोड उत्पन्न करते हैं। स्रोत कई भाषाओं के लिए उत्पन्न किया जा सकता है। यह भी एक बड़ा लाभ है कि आपके पास अपने क्रमबद्ध डेटा के स्पष्ट विनिर्देश हैं, जोसन के विपरीत जहां विनिर्देशन को पढ़ने / लिखने में निहित किया जाता है।


अच्छा लग रहा है, लेकिन मैं सी # का उपयोग करता हूं, यह सी ++, अजगर और जावा के लिए लगता है।
user1776562 17

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