Sorunuz çok fazla sayıda türden dolayı gerçekten geniş, ancak işte profesyonel bir yazılım geliştiricisinin bakış açısı.
Hangi veri kalıcılık mekanizmasını kullandığınızı belirlemek için kullanmak istediğiniz ölçütlerin bir listesini verdiniz. Bunlar:
- Projenin büyüklüğü.
- Oyunun hedef aldığı platform.
- Veri yapısının karmaşıklığı.
- Birçok proje arasında verilerin taşınabilirliği.
- Verilere ne sıklıkta erişilmelidir?
- Aynı uygulama için çoklu veri türü
- Ne kullanılacağına karar verirken düşündüğünüz diğer herhangi bir nokta ilgi çekicidir.
İlk önce, hangi seçeneklerin bizim için uygun olduğunu belirlememiz gerekir. Bir dil veya teknoloji belirtmediğiniz için tam olarak söylemesi zor, ancak muhtemelen XML ile ilişkisel veritabanı depolaması arasında karar vermeye çalışıyorsunuz .
Yapılması gereken önemli bir ayrım, XML'in bir serileştirme tekniği kadar bir depolama mekanizması olmadığıdır . Oyununuz için hafıza içi yapıları temsil etmenin bir yolu. Olduğu göz önüne alındığında, gerçekten bahsediyoruz düz dosyası vs ilişkisel veritabanı depolama. Bunlar tek seçenek değil, ama en yaygın olanları, bu yüzden onları kullanacağım.
Düz dosyalar için:
- XML
- JSON
- YAML
- XAML
- Düz Metin
Veritabanları için:
- SQL Server
- MySQL
- DB2
- torpil
- Daha fazlası
EDIT: Dosyalardan ve ilişkisel veritabanlarından başka mekanizma türlerini sordunuz. Düzenli olarak gördüğüm diğer önemli veritabanı türü, temelde anahtar-değere dayalı "Berkeley-style" veritabanlarıdır. Bunlar verileri yapılandırmak için B-ağaçlarını kullanma eğilimindedir, bu yüzden aramalar hızlıdır. Bunlar, tam olarak ne istediğinizi bildiğiniz yapılandırma / ayar aramaları için harika (örneğin, bana "Seviye 1" için tüm telemetri verilerini verin).
Artık tüm temel özellikleri çözdükten sonra, bazı kriterlerinize değinelim.
Projenin büyüklüğü.
Bazıları aynı fikirde olmayabilir, ancak projenizin boyutunun veri kalıcılık mekanizmanız üzerinde büyük bir etkisi olmayacaktır. İstediğiniz hangi mekanizmadan veri depolayan / yükleyen, yeniden kullanılabilir bir işlev kütüphanesi oluşturmak isteyeceksiniz. İhtiyaç duyduğunuzda kalıcılık mekanizmanızı kolayca değiştirebilmeniz için bir soyutlama katmanı ( Adaptör modeline bakın ) uygulamanızı bile öneririm .
Küçük projeler için, dosya sisteminde XML kullanmak potansiyel olarak işe yarayabilir, ancak oyuncuların istediği zaman verileri değiştirememeleri için bazı güvenlik kaygılarınızı (yani şifreleme) ele almak isteyeceksiniz.
Oyunun hedef aldığı platform.
Platform da büyük bir sorun olmayacak. Geliştirme platformunuz için hedef platformdan daha fazla endişe duymalısınız. Bunun nedeni, bazı dillerin belirli işaretleme türlerini veya veritabanlarını diğerlerinden daha iyi kullanabilmeleridir. Bu, yukarıdakilerden herhangi birini hemen hemen hiçbir dilde kullanamayacağınız anlamına gelmez, ancak bazen sizin için mevcut olan desteklenen araçları kullanmak en iyisidir. Herhangi bir platform düz dosyaları ve ayrıştırma XML'lerini destekleyecektir, ancak mobil platformlarda mümkünse ikili serileştirmeyi göz önünde bulundurmak veya en azından XML'in depolanması için optimize etmek isteyebilirsiniz.
Veri yapısının karmaşıklığı.
Bu biraz zor bir durum. İlişkisel veritabanları sadece varlıkları ve ilişkilerini depolamak için harikadır. İlişkisel bir depolama deposu kullanarak yapıyı bir dosya sistemindeki dosyalarla yaptığınızdan daha iyi bir yeteneğiniz vardır. Varlıklarınız arasındaki ilişki türlerini ve bunları ne sıklıkta değiştirdiğinizi ya da ilişkili varlıkları bulduğunuzu düşünün. Son derece karmaşık yapılar için veritabanı yoluna gitmeyi öneririm.
Birçok proje arasında verilerin taşınabilirliği.
Taşınabilirlik söz konusu olduğunda, veritabanlarının dosyalardan doğal olarak daha ağır olduğunu göz önünde bulundurmalısınız. Kurulum ve yapılandırma ek yükü var, farklı platformlar için farklı veritabanları mevcut olacak, vb. SQLite bu konuda oldukça iyi bir yoldur. Ancak, taşınabilirlik söz konusu olduğunda, XML gibi dosya tabanlı çözümlerle büyük olasılıkla daha kolay bir zaman geçireceksiniz.
EDIT: Yorumlarınızdan birinde taşınabilirlik hakkında bahsettiğiniz başka endişeler var. Sonuç olarak, verilerinizin herhangi bir ürün veya dosya türüne çok sıkı bir şekilde bağlanmasını istemezsiniz. Sonuç olarak, derleme veya yükleme sırasında bir veritabanı / dosya sisteminde kolayca ayrıştırıp saklayabileceğiniz hisse senedi verilerini (düzeyler, düşmanlar, vb.) Bir tür soyut biçimde (sekmeyle ayrılmış dosyalar, XML vb.) Saklayabilirseniz en iyisidir. saati. Bu, depolama mekanizmanızı bir hevesle değiştirebileceğiniz ve ayrıştırma parçasını yeniden yazabileceğiniz anlamına gelir.
Verilere ne sıklıkta erişilmelidir?
Çok fazla veri erişimi, bir tür önbellekleme mekanizmanız yoksa, çok fazla G / Ç anlamına gelir. Veritabanları yapıları bellekte tutar ve veri işleme ve alma için mükemmeldir. Verileri sürekli olarak devam ettiriyorsanız, bir veritabanına bağlı kalmak isteyebilirsiniz.
Aynı uygulama için çoklu veri türü
Cilt kesinlikle bir değerlendirmedir, ancak binlerce veya milyonlarca nesneyi ısrar etmekten bahsetmiyorsanız, dosya sistemi hala bir çözüm olarak kabul edilebilir.
Oyun tipi
Oluşturduğunuz oyun türünün seçtiğiniz platform üzerinde büyük bir etkisi olabilir. Evet, çoğu müşteri için tek oyunculu oyunlarda, sıkıştırılmış veya şifreli bir dosya sistemi tabanlı çözüm kullanarak iyi olacaksınız. Çevrimiçi bir bileşeni olan oyunlar hakkında konuşuyorsanız, bu çılgınca olurdu. Veritabanı yoluna git ve baş ağrısını kurtar. Sunucunun bir arka uç kümesini kullanarak tüm verilerinizi yönetmesine izin verin.
Umarım bu geri bildirimlerden bazıları yardımcı olur. Hiçbir şekilde tamamen kapsamlı değildir ve nihayetinde karar vermek size bağlıdır, ancak yorumum size düşünmeniz gereken bazı şeyler vermelidir.
EDIT: Bir hibrid yaklaşımı almanın çok anlamlı olduğu bazı zamanlar vardır. Örneğin, bir MMORPG geliştirdiğinizi varsayalım. İstemci tarafında, diğer oyuncularla ilgili önbelleğe alınmış verileri ilişkisel olmayan bir veritabanında saklayabilirsiniz (yukarıda belirtildiği gibi). Sunucu tarafında, tüm oyun verilerini sürdürmek için ilişkisel bir veritabanında saklıyorsunuz. Ve sonra yine müşteri tarafında, daha kolay erişilebilirlik için büyük olasılıkla log / veri, konfigürasyon vb.
Bir başka poster de, bir veritabanında üretim için veri depolasanız bile, geliştirme için düz dosyaları kullanabilmenizin bir yolunu bulsanız bile, bunun güzel olduğunu belirtti ... başka bir ürünü karışımdan çıkarmak daha kolay olabilir .