क्या मुझे अपने डेटा सहेजने के लिए पाठ फ़ाइलों का उपयोग करना चाहिए?


22

मेरा प्रश्न यह है कि मुझे अपने गेम डेटा को बचाने के लिए पाठ फ़ाइलों का उपयोग करना चाहिए या नहीं। मुझे ऐसा करने पर कुछ बुनियादी चिंताएँ हैं:

  1. डेटा की सुरक्षा के लिए वास्तव में कोई रास्ता नहीं है, और इस प्रकार, उपयोगकर्ता सब कुछ खराब कर सकता है अगर वे इसे छूते हैं और मैं ऐसा नहीं करना चाहता हूं।

  2. यह शायद मेरे डेटा को स्टोर करने का सबसे कारगर तरीका नहीं है (इसमें बहुत कुछ होगा)

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

यदि मुझे पाठ फ़ाइलों का उपयोग नहीं करना चाहिए, तो मुझे क्या उपयोग करना चाहिए? मुझे C ++ संगत कुछ चाहिए।


2
जिप फाइलें (पासवर्ड के साथ) - कई पुस्तकालय उपलब्ध हैं जो आपको ऐसा करने की अनुमति देंगे, और इसे डिस्क स्थान पर सहेजना चाहिए
SeanC

2
En.wikipedia.org/wiki/ROT13 जैसे एक साधारण सिफर को लागू करना फाइलों को संपादित करने से औसत उपयोगकर्ता रखने के लिए पर्याप्त होना चाहिए। हर कोई शायद जानता है कि वे वैसे भी क्या कर रहे हैं।
यूल 22:13

1
यह अपना रास्ता है, लेकिन मैं अपने खेल को आसानी से परिवर्तनीय होना पसंद करता हूं।
मिमी जूल

जवाबों:


28

अभी के लिए, चूंकि आप अभी शुरुआत कर रहे हैं, पाठ फ़ाइलें शायद ठीक हैं। आपके प्रश्न में कुछ चिंताएँ हैं जिन्हें मैं संबोधित करूँगा।

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

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

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

class DataWriter {
  virtual void save(GameState state) = 0;

  virtual ~DataWriter() { }
};

class TextFileDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to text file
  }
};

class DatabaseDataWriter : public DataWriter {
  virtual void save(GameState state) {
    //write to database
  }
};

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


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

6
@Althezel बात यह है कि आप अपने डेटा को कैसे बचाते हैं, कोई भी इसे संशोधित करने के लिए पर्याप्त रूप से निर्धारित होता है। इस अर्थ में, यह आमतौर पर आपके कीमती विकास के समय की बर्बादी की कोशिश करने और जगह बचाने के लिए होता है :)
pwny

@Althezel डेटाबेस के लिए, इसे इंजन के एक प्रकार के रूप में सोचें जिसमें आप डेटा पढ़ने या लिखने के लिए अनुरोध पास करते हैं। यह इंजन एक कुशल तरीके से इसे बचाने / पढ़ने के लिए जिम्मेदार है, आमतौर पर तालिकाओं में संबंधपरक रूप में। आपके उपयोग के मामले में, मैं SQLite ( sqlite.org ) पर एक नज़र डालूँगा । मूल रूप से आप स्थानीय SQLite डेटाबेस से कनेक्ट करने के लिए C ++ लाइब्रेरी का उपयोग करेंगे (SQLite स्थानीय फ़ाइलों का उपयोग करता है) और अपने डेटा तक पहुंचने के लिए SQL सिंटैक्स में उस लाइब्रेरी कॉल को पास करें।
pwny

2
यह एक दुखद दुनिया है जब डेवलपर्स उन सूचनाओं से बाहर निकलने में सक्षम होना चाहते हैं जिन्हें वे अपने कंप्यूटर पर संग्रहीत करते हैं।
क्लासिकटहंडर

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

3

गेम डेटा शब्द का अर्थ कई चीजें हो सकता है, उदाहरण के लिए

  • Gamestate
  • विन्यास फाइल
  • नक्शे, बनावट, ध्वनियाँ, स्क्रिप्ट, एनीमेशन डेटा, ...
  • स्थानीयकरण
  • जीयूआई लेआउट डेटा
  • और मैंने सोचा नहीं था

प्रत्येक श्रेणी के लिए आप एक और तरीका अपना सकते हैं।

उदाहरण के लिए आप स्थानीयकरण सामान के लिए SQLite , मैप्स के लिए बाइनरी, बनावट, ध्वनियों और इतने पर उपयोग कर सकते हैं ।

कॉन्फ़िगरेशन सामान के लिए आपको xml फ़ाइलों को बदलने के लिए आसान का उपयोग करना चाहिए।

हमेशा की तरह, सही उत्तर "यह निर्भर करता है" है।

C ++ बाइंडिंग के साथ कई xml पार्सर मौजूद हैं और SQLite के लिए c ++ बाइंडिंग भी मौजूद है।


यह एक धार्मिक बात हो सकती है लेकिन मैं XML के बजाय कॉन्फ़िगर के लिए INI फ़ाइल प्रारूप का उपयोग करूंगा। बाद वाला इस परिदृश्य के लिए एक ओवरकिल जैसा महसूस करता है। और बढ़ावा पुस्तकालयों में एक आईएनआई पाठक है।
आर्टूर कज्जाका

0

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

बाइनरी बूँद में स्ट्रीमिंग अपेक्षाकृत तेज़ है और उपयोगकर्ता को डेटा देखने और इसे बदलने से भी रोकती है।

आप मानक पुस्तकालय धाराओं का उपयोग करके यह सब प्राप्त कर सकते हैं।


2
जबकि बाइनरी ब्लॉब तेज़ और आसान है (दोनों देव और लोड / चलाने के लिए) बाइनरी ब्लॉब के साथ सबसे बड़ी समस्या है जैसे ही आप डेटा संरचना संगठन के बारे में कुछ भी बदलते हैं (एक एकल floatसदस्य को एक में जोड़ें) ऑब्जेक्ट), पुराना savegames पूरी तरह से अमान्य हो जाता है। विकास के दौरान इससे निपटना मुश्किल है, लेकिन अगर आप इसके लिए तैयार हैं, तो हर तरह से।
बॉबोबो जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.