Bir MMORPG'de genellikle ne tür veritabanları kullanılır? [kapalı]


Yanıtlar:


38

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ı.


1
+1 Çoğu insanın orada kendi veritabanı yazdığını hayal ediyorum. Ama NoSQL dünyasının şu anda büyümesi harika.
Jesse Dorsey

5
Daha sonra bir şeyi yoğun şekilde kişiselleştirmenize rağmen, orada prototip yapabileceğiniz en az bir DB var.
kodlayıcı

9
coderanger haklı. Bir MMO için özel bir veritabanı yazdım. Bugünün dünyasında tekrar başlatacak olsaydım, muhtemelen mevcut teknolojiyi uyarlamaya daha yakından bakardım, çünkü dünyanın 4 yıl önce olduğundan daha aktif olduğunu söyler. Birçok MMO aslında SQL'de çalışıyor, bazıları iyi, bazıları çok iyi değil. Max shard eşzamanlılığı (maksimum bölge veya kıta eşzamanlılığının aksine) bu oyunlar için düşüktür.
Ben Zeigler

2
“Çünkü MMO'nun normal operasyon için ihtiyaç duyduğu büyük çoğunluğu oluşturan ağır yapılandırılmış hiyerarşik verileri verimli bir şekilde depolayamıyorlar” - uygulama geliştirmede oyun programlamasında olduğundan daha doğru. Maalesef elimizde olanlara bağlı kaldık ve NoSQL çözümleri için performans (ve DBA'ların kullanılabilirliği) şu anda RDBMS'ler için olanlarla eşleşemediğinden, verilerimizi elverişli bir forma sokmak zorundayız. RDBMS en.
BlueRaja - Danny Pflughoeft 18:11

1
Bu birkaç yıl önce doğru olmuş olabilir, ancak şimdi gereken performans özelliklerini sunan bir dizi kullanıma hazır veri tabanı mevcut.
kodlayıcı

35

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.

  1. Kendilerini almak için ucuz ve kolay olanı yakalayarak başladılar
  2. Nihayetinde teknolojilerinin çoğunu kendi başlarına yuvarlamak zorunda kaldılar. (Ve bazen donanım)

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.


25

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.


1
Bunları bellekte tutarsanız, bellekte bir veritabanı uygulamanız gerekir veya bölgeler arasında işlem yaparken kalem çoğaltması / kaybı (örnek olarak) yapmanız gerekir. "Onları bellekte tut" sadece tüm oyuncuların sürekli aynı hafıza alanı içinde olduğu sürece çalışır.

1
Her ne kadar Cryptic's DB'de ikisi de ACID ile garanti edilmedi, online ve hit puanlar için geçerli olsa da, örneğin oyuncu başına saniyede birçok kez gerçekleşebilecek görev kilometre taşları (5/10 kurt öldürülmüş) veya XP ödülleri için doğru değil.

1
Sunucu çökmeye başlarsa, görev ilerlemelerini kaybedecek kullanıcılarla iyi bir şekilde ilgileniyorsanız, işlemsel anlambilim gerektirmezler. XP ödülleri söz konusu olduğunda, bu bir seviyeyi kaybetmek anlamına gelebilir ve bir oyun çöktüğünde ve bir seviyeyi kaybettiğinizde, bir sonraki adım genellikle oynamayı bırakmaktır.

6
XP'nin işlem görmesi gerekiyor. İlk başta CrypticDB'nin oluşturulmasına yol açan spesifik istismarlardan biri (güven bana yazdım) bir kerede birden fazla sunucuda XP kazanımı ve kullanıcı tarafından kesilebilir bir senkronizasyon başarısız oldu. Bir karakterin ilerlemesi için kritik öneme sahip olan herhangi bir şeyin gerçekten gerçekleştirilmesi gerekir, aksi takdirde oyuncular bundan yararlanmanın bir yolunu bulur.
Ben Zeigler

1
@ expiredninja: Bu çok açık bir soru. Ancak 'flatfile' ile sadece "diske keyfi serileştirme" anlamına gelir. Oyun geliştiricileri, örneğin her alanı fprintf ile sık sık yazarlardı.
Kylotan

10

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.


10

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.)


5

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.


5

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. :)


0

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ı. .


0

Aslında, uygulamanıza bağlı - sonuç budur. Sosyal RPG'ler geliştirdiğimiz ve Google App Engine'i arka uç olarak kullandığımız yerlerde çalışıyorum.


0

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.


1
Tüm bu bilgileri yerel olarak böyle sakladığınızda, bir veritabanında olması gerekmez.
Josh
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.