Oyuncuların dünyayı bir şekilde şekillendirdiği çevrimiçi bir oyunum var - örn. Ultima Online'ın evlerinizi doğrudan dünya haritasının belirli kısımlarına inşa edebileceğiniz konutları. Bunlar, kalıcı dünyanın bir parçası olarak zaman içinde devam etmesi gereken değişikliklerdir.
Aynı zamanda, tasarım ekibi yeni içerikler ekliyor ve yeni oyuncular için oyunu geliştirmek ve genişletmek için eski içeriği değiştiriyor. Bunu test sırasında önce bir geliştirme sunucusunda yapacaklar ve daha sonra çalışmalarını canlı sunucudaki oyuncuların "çalışmaları" ile birleştirmek zorunda kalacaklar.
Oyun tasarımı sorunlarını giderdiğimizi varsayarsak - ör. oyuncular yalnızca belirlenmiş alanlarda inşa edebilirler, bu nedenle coğrafi olarak tasarımcı düzenlemeleriyle çatışmazlar - yeni tasarımcı verileri yeni oyuncu verileriyle birleştirildiğinde çakışmaları önlemek için verileri işlemenin veya veri yapılarını düzenlemenin iyi yolları nelerdir?
Örnek 1: Bir oyuncu yeni bir tür eşya üretir ve oyun buna 123456 kimliğini atar. Bu öğenin örneklerinin tümü 123456'ya işaret ediyor. Şimdi oyun tasarımcılarının benzer bir sistemi olduğunu ve bir tasarımcının 123456 numaralı yeni bir öğe oluşturduğunu hayal edin. Bu nasıl önlenebilir?
Örnek 2: Birisi tüm ejderhalarınıza Fransız aksanı veren popüler bir mod yapar. assignFrenchAccent
Her ejderha nesnesine yeni ses varlıklarını atamak için kullandıkları yeni bir nesne içeren bir komut dosyası içerir . Ama aynı adı taşıyan bir nesneye sahip "Napoleon vs Smaug" DLC'nizi dağıtmak üzeresiniz - bunu müşteri hizmetleri problemleri olmadan nasıl yapabilirsiniz?
Aşağıdaki stratejileri düşündüm:
- 2 ayrı dosya / dizin / veri tabanı kullanabilirsiniz, ancak okuma işlemleriniz oldukça karmaşıktır. "Tüm Öğeleri Göster" tasarımcı DB üzerinde bir okuma ve DB oynatıcısında bir okuma gerçekleştirmelidir (ve yine de 2'yi bir şekilde ayırmak zorundadır.)
- Bir mağazada 2 farklı ad alanı kullanabilirsiniz, örn. birincil anahtar olarak dizeleri kullanmak ve "DESIGN:" veya "PLAYER:" ile önek kullanmak, ancak bu ad alanlarını oluşturmak önemsiz olabilir ve bağımlılıklar net olmayabilir. (örn. RDBMS'de, dizeleri etkili bir şekilde birincil anahtar olarak kullanamayabilirsiniz. Tamsayıları kullanabilir ve tasarımcı gibi birincil sayıların altındaki belirli bir sayının altındaki tüm birincil anahtarları ayırabilirsiniz. Ancak bu bilgiler RDBMS tarafından görülemez ve yabancı anahtar bağlantıları 'bölünmeyi' aşacaktır, yani tüm araçların ve komut dosyalarının açıkça etrafta çalışması gerekir.)
- Her zaman aynı paylaşılan veritabanında gerçek zamanlı olarak çalışabilirsiniz, ancak performans düşük olabilir ve oyuncu verilerine zarar verme riski artabilir. Ayrıca, farklı dünya verileri olan 1'den fazla sunucuda çalışan oyunlara da uzanmaz.
- ... başka fikirleriniz mi var?
Bana göre bu, öncelikle çevrimiçi oyunlar için bir sorun olsa da, kavramların modding için de geçerli olabileceği, topluluğun geliştiricilerin oyunlarını yamaladığı aynı zamanda modlar oluşturduğu yerlerde. Yeni yamalar çıktığında modun kırılma olasılığını azaltmak için burada kullanılan herhangi bir strateji var mı?
Ben de bunu "sürüm kontrolü" olarak etiketledim çünkü bir düzeyde bu ne olduğunu - birleştirilmesi gereken veri geliştirme 2 dalları. Belki de bazı yönler bu yönden gelebilir.
DÜZENLEME - sorunu netleştirmeye yardımcı olmak için yukarıda bazı örnekler eklendi. Sorunun gerçekten kompozit anahtarlar aracılığıyla bir mağazada uygulanabilen ad boşluklarından biri olduğunu düşünmeye başlıyorum. Bu en azından birleştirme stratejisini basitleştirir. Ama görmediğim alternatifler olabilir.