Yanıtlar:
Yaptık, umarım Ben Z aslında veritabanımızın asıl yazarı olduğu için nedenleri daha iyi açıklayacağız. Kısa versiyon, ilişkisel DB'lerin oyunlar için çok kullanışlı olmadıklarıdır, çünkü yoğun şekilde yapılandırılmış hiyerarşik verileri verimli bir şekilde depolayamazlar, bu da bir MMO'nun normal işlem için ihtiyaç duyduğu verilerin çoğunu oluşturur. Şu anda iki canlı oyunumuzu üretmekte ve güçlendirmekte olan özel bir nesne veri tabanı ve dağıtılmış işlem işleme sisteminin bir parçasını oluşturmayı seçiyoruz.
Sen de aynısını yapmalısın gibi mi? Muhtemelen hayır, en azından ilk başta değil. SQL'den kaçınmayı hala savunurdum, ama artık "NoSQL" dünyasında birkaç yıl önce var olmayan daha birçok seçenek var.
Bu, çoğu MMO'nun SQL (ilişkisel) veritabanlarında çalıştığını söyledi. Eve'nin birkaç TBC RAMSAN'ın üstünde oturan bir SQL Server kurulumunda çalıştığını biliyorum (muhtemelen hayatımda asla bu kadar pahalıya mal olacak).
EDIT: Umarım bunu buraya göndermeme aldırış etmiyordur , ancak bu GDC'08'de veritabanımızla ilgili yaptığımız sunumla ilgili bazı linkler ve yorumlar içeren bir blog yazısı.
Tamam, bu cevap daha çok bir gözlem.
Tam açıklama MMORPG'de çalışmadım. 2009'da en çok ziyaret edilen ilk 10 siteden biri olarak çalıştım ve oyun motoru şirketinde MMORPG teknolojisi yaptığını düşünen (gönderilip gönderilmediğini bilmiyorum) çalıştım.
Çok büyük ölçekli şirketler (Google, Facebook, Twitter, vb.) Olanlara bakarsanız, oyun şirketleri olmadıklarını biliyorum ama bu alanda bakmaya değer olduklarını biliyorum) önemli olduğunu düşündüğüm iki şey var.
Büyük bir hata bazı pahalı anahtar teslimi bir şey kapmak ve büyülü bir şekilde sizin için ölçek beklemektir. Bu şekilde çalışmıyor. Ölçeklendirmenin anahtarı her yeni zorlukla başa çıkabilmektir. Kolayca içeri ve dışarı taşıyabileceğiniz esnek, kullanımı kolay çözümler gerekir.
Bu yüzden sana tavsiyem, eğer başlarsan, başa çıkacak en az baş ağrısına sahip olanı bul.
Temel olarak, çok çeşitli yaklaşımlar var ve bence geliştiricilerin deneyimlerine dayanarak veritabanının özellikleri kadar seçildiklerini düşünüyorum. Bir uçta, birçok MMO standart ilişkisel veritabanlarını kullanıyor - örneğin. Camelot'un Karanlık Çağları kullanılmış / kullanıyor (hala devam ediyor mu?) MySQL , FreeRealms değiştirilmiş bir Postgresql vb. Kullanıyor .
Ölçek boyunca hareket ederken, Lonca Savaşları var: SQL Server kullanıyorlar , ancak verilerini tek bir BLOB olarak oraya yapıştırıyorlar. Bu, bir veritabanının sağladığı bazı avantajlarla, normal ikili formatlarının avantajlarından yararlanmalarını sağlar. Söylemeye gerek yok, muhtemelen bu yaklaşımın bazı dezavantajlarını da görebilirsiniz, ancak düz dosyalarla çalışan bir şirket için muhtemelen hala bir adımdır.
Öyleyse, henüz resmi olan NoSQL yaklaşımlarını kullanan bazı yerler var. Farmville, görünüşe göre memcached'e dayanarak amaç için yaptıkları membazı kullanıyor . Bu, MongoDB, CouchDB, vb. Gibi birçok özelliği paylaşıyor. Yine de, bu yaklaşımlarla, genellikle kendi depolama formatlarınızı yuvarlıyorsunuz ancak dağıtım, önbellekleme, yedeklilik, vb.
Bazıları tamamen kendi NoSQL'lerini kullanıyor: Cryptic , benzer bir şey yaptıklarını ama aynı zamanda onu üretimde kullanmadıklarını söyledi. ( EDIT : ancak aşağıdaki yorumları görün.)
Ve sonra düz metin veya ikili dosyalar kullanan insanlara geliyorsunuz - Ultima Online, Everquest, vb. Gibi eski oyunların hepsi bu rotadan geçti ve oyun geliştirme deneyimine sahip bir şirket için ancak çok az veri tabanı deneyimi bu işe yarar. çok.
Ayrıca, kendi veritabanınızı terimden bazı anlamıyla yazma konusunda neredeyse hiç uğraşmadığınızı da unutmayın - oyunlarda, bellekte veya diskte kendilerini ödünç vermeyecek şekilde yönetmeniz gereken verilere her zaman ısmarlayacaksınız genel bir yazılıma. Her ne zaman bazı veriler istediğinizde SQL sorguları yapamazsınız, bu nedenle ne kullanırsanız kullanın kodunuzda birçok bilginizi yansıtmanız gerekir.
Burning Sea'nin Korsanları'nda MySQL'e baktık (dürüst olmak gerekirse Postgres'i tercih ederdim) ve yük altında kalmaya başladığında Microsoft SQL Server'a geçtik. Açıkçası, yine de, muhtemelen gelecekte bu rotaya gitmeyeceğim. PotBS verilerinin çoğu zaten devam etmeden önce seri hale getirilmiştir, bu nedenle DB'de bulunanların büyük bir kısmı büyümüş bir anahtar / değer deposundan başka bir şey değildir. Bunun ötesinde, kalıcılık katmanımızdan daha iyi performans elde etmek ve verilerin bellekte önbelleğe alınma şeklini daha iyi kontrol etmek için, veritabanının önüne oturan bir önbellek sunucusu yazdık.
Yani Kylotan haklı, bazı seviyelerde kendi başınıza dolaşmayacaksınız. SQL ilişkisel veritabanı sunucuları, oyunların veri kullanması için tasarlanmamıştır. İlişkisel DB sunucularının tüm veritabanlarının sonu olduğunu varsaymak yerine, bir araç seçmeden önce aradığımız faydaları daha iyi düşünmeliydik.
Bir dahaki sefere, BerkleyDB veya diğer NoSQL tarzı DB'lerin bazıları gibi şeylere daha fazla bakardım.
Unutulmaması gereken başka bir şey (nispeten) statik bir veri kümeniz varsa, onu bir veritabanında saklamamanızdır! Yazım tanımlarınızı, madde tanımlarınızı, haritalarınızı vb. Bir veritabanında saklamak için gerçekten iyi bir neden yoktur. Adı dışında nadiren sorgularız. Bir çok insanın, sürekli ısrarcı verinin yanında bu şeyleri saklamak için oyun geliştirmeye girdiğini görüyorum ve bu tamamen farklı bir şeyler sınıfı.
Bunun için bir dosya sistemi gibi bir veri deposuna ihtiyacınız var. Geliştirme dışında, ACID'ye ihtiyacınız yok, CRUD'a ihtiyacınız yok, bu tür veriler için bir veritabanına ihtiyacınız yok. Gelişimin içinde bir veritabanına ihtiyacınız var, ama yine de bir VCS'ye ihtiyacınız var ve VCS seçiminiz sizin için bu veritabanı seçimini yapacak.
(Eğer oyuncuların özel büyüler veya eşyalar veya görevler yaratabildiği bir oyun üzerinde çalışıyorsanız, o zaman bu veriler oyuncu verileriyle aynıdır ve tekrar bir veritabanına ihtiyacınız vardır.)
MMORPG'ler yoğun uygulamalardır ve büyük bir girişimdir. Oyun geliştirme ile başlıyorsanız, daha küçük bir şey yapmanızı şiddetle tavsiye ederim.
Bu, kurulumunuzdan iki tane sıkmak için en iyi performansa ihtiyacınız olacağını söyledi. Belli ki bir sunucu grubuna / kovanına ihtiyacınız olacak. Ağ iletişimi nispeten pahalı olduğu için (ve çoğu MMORPG gerçek zamanlıdır), merkezi veritabanınızı oyun sunucularınızın her birine (tercih ettiğiniz veritabanındaki gerçek zamanlı düşük gecikmeli kopyalamanın eşdeğeri) çoğaltmak isteyebilirsiniz.
Eğer sunucularınızdan her biri oyun dünyasının belirli bir bölümüne hizmet ediyorsa (WoW çalışır gibi); dağıtılmış bölümlenmiş görünümler gibi bir şey . DPV'ler, veritabanınızın satırlarını farklı sunucularda bölümlere ayırmanıza izin verir; Her sunucudaki sütunlardaki kısıtlamalara göre. Hem MSSQL hem de Oracle, yalnızca NEREDE veya ON yan tümcesinde bulunan verileri içeren sunucuyla konuşabilecek kadar akıllıdır. Açık kaynaklı tekliflerden herhangi birinin DPV'ye sahip olup olmadığından emin değilim.
Tüm bunların net sonucu, hangi DB'yi kullandığınızın bir önemi yoktur , sadece iyi bir isim kullanır: MSSQL, Oracle, MySQL, PostgreSQL. Veritabanınızı ANSI SQL'e yazın ve hangi sistemin en iyi sonucu verdiğine bakın - öğrenmenin tek yolu budur.
Yüksek eşzamanlılık için tasarlandığından NoSQL rotası da iyi bir fikir olabilir. Pranny'nin önerisi hile yapabilir.
MongoDB'yi (NoSQL) kullandım, TCP üzerinden erişilebilen çok hızlı bir belge deposu. Bir şans ver! Bu harika!
Kendi DB'nizi yazmak göz korkutucu bir iştir. Öncelikle orada olanları keşfetmenizi ve belirli ölçütlerinize uyan herhangi bir şey bulamıyorsanız, kendinizinkini oluşturun. Oh, kaynak açmayı unutma. :)
Sanırım, hangi veri türüne ihtiyaç duyduğunuza ve hangi formda olduğuna oldukça bağlı.
Dışarıdaki çoğu insan oyuncu bilgileri gibi "dinamik" veriler için "standart" SQL veritabanlarını kullanıyor, SQL Server, MySQL, PostgreSQL gibi.
Bununla birlikte, "dahili" veriler (dünyanın durumu, içeriği, ....) herhangi bir formda saklanabilir ve tahminimce çoğu şirket, bu bölüm için en azından kısmen özel veri tabanları sistemlerini kendi ihtiyaçlarına uygun olarak yazacaktı. .
Bu soru oldukça eski fakat benim nasıl başa çıkılacağı konusundaki fikrim bugün olduğu gibi geçerli.
İlişkisel bir veritabanı kullanıyorsanız, üzerindeki yükü azaltmanız gerekir, böylece bu fikir yardımcı olacaktır.
Tüm genel bilgileri yerel bir DB'de ve her bir istemci sistemde ve aynı zamanda sunucularda depolayın.
Tüm tabloları öğelerle birlikte müşteri veritabanında saklayın. İstemci, bu silahı farenin üzerine getirdiğinizde sunucuya bakmak yerine, yalnızca yerel veritabanını istatistikler için denetler. Sunucunun hesaplanırken istatistikleri çekmek için kendi veritabanına sahip olması ve müşterilere kalan zarar ve sağlığı iletmesi.
Bu fikirle ilgili en kötü durum, müşteri veritabanına girmeyi başarırlarsa herkesin tüm silahların istatistiklerini görmesidir. Değerleri değiştirse bile neden önemli değil, sunucudaki veritabanı değerleri oyunda ne hesaplıyorsa.