Kayıt verilerim için metin dosyaları kullanmalı mıyım?


22

Benim sorum, oyun verilerimi kaydetmek için metin dosyaları kullanmam gerekip gerekmediği. Bunu yapmayla ilgili bazı temel endişelerim var:

  1. Verileri korumanın gerçekten bir yolu yoktur ve dolayısıyla kullanıcı dokunduğunda her şeyi mahvedebilir ve bunun olmasını istemiyorum.

  2. Muhtemelen verilerimi saklamanın en etkili yolu değildir (Çok fazla olacaktır)

Yine de metin dosyalarını nasıl ayrıştırıp yazacağımı çok iyi biliyorum. Sadece geleceğe bakmak istiyorum, çünkü geçiş yapmayı düşündüğüm şey bu yüzden beni, gelişimin sonuna yakın bir şekilde yumruklamıyor.

Metin dosyalarını kullanmamam gerekiyorsa ne kullanmalıyım? C ++ uyumlu bir şeye ihtiyacım var.


2
Zip dosyaları (şifre ile) - bunu yapmanıza izin verecek birçok kütüphane mevcut ve disk alanından tasarruf etmeli
SeanC

2
Gibi basit bir şifre uygulanması en.wikipedia.org/wiki/ROT13 dosyaları düzenlemesini ortalama kullanıcıyı tutmak için yeterli olmalıdır. Diğer herkes muhtemelen ne yaptıklarını biliyordur.
Exilyth,

1
Kendi tarzın olsun, ama oyunlarımın kolayca değiştirilebilmesini seviyorum.
mmyers

Yanıtlar:


28

Şimdilik, daha yeni başladığınızdan beri, metin dosyaları muhtemelen iyi durumda. Sorunuzda ele alacağım birkaç endişe var.

  1. Verileri korumak, muhtemelen düşündüğünüz kadar önemli değildir. Oyununuz çok oyunculu ise, verileri zaten sunucu tarafında kaydetmiş olacaksınız. Oyununuz tek oyuncuysa, oyuncular verileri değiştirirse ne olur? Bir şeyi kırarlarsa bu gerçekten onların hatası ve tekrar kurabilirler.

  2. Performans aynı zamanda düzgün bir şekilde planlamayı başaramadığımız başka bir şeydir. Aslında kadar Gerçekten optimize olmamalıdır ölçmek bir performans sorununu. Tahminimce, muhtemelen o kadar büyük olmayan bir miktar veriye sahip olacaksınız ve bu metin dosyaları iyi olacak.

Olduğu söyleniyor, en iyi bahis, veri tasarrufu ve yükleme rutinleri mümkün olduğunca en iyi şekilde özetlemek. Örneğin, bir temel sınıfa sahip olabilir, örneğin DataWriter, ve farklı yöntemlerin farklı uygulamalarını sağlayabilirsiniz. Çok basit bir örnek şöyle görünür:

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
  }
};

Sonunda oyununuzu profillendiğinde ve performans darboğazının dosya yazma yordamında olduğunu fark ettiğinizde, bu sınıfın başka bir uygulamasını (örneğin bir veritabanına yazmak için) çağıran kodda minimum değişiklik yaparak sağlayabilirsiniz.


Bu tek kişilik bir oyundur ve verilerle uğraşmak istese de bunlar benim düşüncelerimdi. Bilmiyorum, metin dosyaları ile ilgili bir şeyler profesyonelce görünmedi ve kullanıcının berbat olmasına engel olabileceğimi düşündüm, muhtemelen yapmalıyım. Ayrıca, "Veritabanı" derken ne demek istiyorsun? Bunun etrafa çok atıldığını duyuyorum ama tam olarak ne tür bir dosya gerektirdiği konusunda hiçbir fikrim yok.
Althezel,

6
@Althezel Sorun, verilerinizi nasıl kaydettiğinizden bağımsız olarak, üzerinde değişiklik yapabilecek kadar kararlı olan biri. Bu anlamda, genellikle korumaları yerine koymaya çalışmak değerli gelişim zamanınızın
israfı olur

@Althezel Veritabanlarına gelince, veri okuma veya yazma isteklerini ilettiğiniz bir tür motor olarak düşünün. Bu motor, genellikle tablolardaki ilişkisel formda, verimli bir şekilde kaydetmek / okumaktan sorumludur. Kullanım durumunuzda SQLite'a ( sqlite.org ) bir göz atardım . Temel olarak, yerel bir SQLite veritabanına (SQLite yerel dosyaları kullanır) bağlanmak için C ++ kütüphanesini kullanır ve verilerinize erişmek için bu kütüphaneyi SQL sözdiziminde iletirsiniz.
Pwny

2
Geliştiricilerin, kullanıcıları kendi bilgisayarlarında depoladıkları bilgilerden uzak tutabilmeleri çok üzücü bir dünya.
ClassicThunder

2
Çok az sayıda oyun "save-data.txt" gibi şeyler depoladığı için metin dosyalarını kullanmak gerçekten profesyonelce bir şey değil; Bu bazen kendilerine eklenen ikili verileri içerir. Her Uygarlık ve Toplam Savaş serisi oyunu, örneğin, çok çeşitli oyun verileri için gerçek .txt dosyalarını kullanır. Bunun için en yaygın kullanılan 'yükseltme', verileri bazı ikili blob'lar hariç - sadece bir metin dosyası olan düz bir dosya olarak depolamayı bırakan bir veritabanı sistemidir.
BrianH

3

Oyun Verileri kelimesi birçok anlama gelebilir, örneğin

  • Gamestate
  • Yapılandırma dosyaları
  • Haritalar, dokular, sesler, senaryolar, animasyon verileri, ...
  • yerelleştirme
  • GUI düzen verileri
  • daha fazla düşünmedim

Her kategori için başka bir yaklaşıma sahip olabilirsiniz.

Örneğin , Yerelleştirme için SQLite , Haritalar için ikili, dokular, sesler vb. Kullanabilirsiniz .

Yapılandırma işleri için xml dosyalarını değiştirmek için kolay kullanmalısınız.

Her zaman olduğu gibi, doğru cevap "bağlıdır".

Bir c ++ bağlayıcısı olan birçok xml ayrıştırıcısı vardır ve SQLite için c ++ bağlayıcısı da vardır.


Dini bir şey olabilir, ancak INI dosya formatını XML yerine config'ler için kullanmak istiyorum. İkincisi, bu senaryo için bir üstesinden gelme hissi veriyor. Ve artırma kütüphanelerinde bir INI okuyucu var.
Artur Czajka

0

Verilerinizi ikili blob olarak kaydedebilir ve bu dosyaya erişmeye başladığınızda verileri tekrar yayınlayabilirsiniz. Bu, her iki sorununuzu da çözer. Serileştirme kodunun serileştirme işlemiyle tamamen aynı olduğundan emin olun.

İkili blobda akış yapmak oldukça hızlıdır ve ayrıca kullanıcının verileri görmesini ve değiştirmesini önler.

Bütün bunları standart kütüphane akışlarını kullanarak elde edebilirsiniz.


2
İkili blob hızlı ve kolaydır (hem dev hem de yüklemek / çalıştırmak) İkili blob ile karşılaştığım en büyük sorun , veri yapısı organizasyonu hakkında bir şeyi değiştirir değiştirmez (tek bir floatüyeye tek bir üye eklemek kadar) nesne), eski savegames tamamen geçersiz hale gelir. Geliştirme sırasında bununla başa çıkmak zordur, ama eğer başaramazsanız, elbette.
bobobobo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.