Veritabanını kullanan dağıtılmış C ++ oyun sunucusu


11

C ++ sıra tabanlı oyun sunucum (veritabanını kullanan) mevcut ortalama istemci sayısına (oyunculara) dayanmaz, bu yüzden tüm istemcilerin hala içinde kalacağı birden fazla (birden fazla) bilgisayar ve veritabanına genişletmek istiyorum tek oyun dünyası (sunucular birbirleriyle iletişim kurmalı ve birden fazla veritabanı kullanmalıdır).

En iyi şekilde nasıl yapılacağını açıklayan bazı öğreticiler / kitaplar / ortak standartlar var mı?

Yanıtlar:


8

"Tek bir oyun dünyasında kal " için MMO terminolojisi tek parçadır . EVE online , her oyuncuyu tek bir parçaya doldurmaya çalışan tek büyük MMO'dur.

Şanslıyız , nasıl yaptıklarına dair çok bilgilendirici bir makale yayınladılar .


(kaynak: gamasutra.com )

Kötü haber. EVE çevrimiçi tekniklerini genel olarak uygulayamazsınız. Çözümleri kesinlikle kendi türlerine ve uygulamalarına göre uyarlanmıştır.
NOT : EVE çevrimiçi süper süslü tek parça ağı için bir veritabanı kullanırlar . Dağıtılmış veritabanları için ölçeklenebilir, tutarlı, orta derecede gerçek zamanlı bir çözüm tasarlayamadılar.

Her iki durumda da nasıl yapacağınızı okumak kendi çözümünüzü tasarlamanıza yardımcı olmalıdır. Ancak dikkat edin, çok zor bir sorunu çözmeye çalışıyorsunuz .

Oyun sunucunuzu dağıtmak yerine önce diğer caddelerinizi keşfetmenizi öneririm.

  • Oyun sunucunuzun profilini oluşturun.
    • Sorun varsa CPU yükünü azaltmak için sunucu kodunuzu optimize edin.
    • Ağ sohbetini azaltmak için istemciler ve sunucu arasındaki iletişim protokolünü optimize edin.
  • Oyun sunucusunu veritabanı iletişimleri için optimize edin.
    • bir sorgu optimize edici çalıştırın ve sonra uygun değişiklikleri yapın.
    • DB etkileşimini en aza indirgemek
  • DB'yi ayrı bir makineye taşıyın.
    Bu genellikle bir tona yardımcı olur. Mümkünse DB'yi aynı yerel ağda tutun, ancak sunucu donanımında çalışan tek şey oyun sunucunuzun çok daha şevkli olmasına yardımcı olmalıdır.

"Büyük" kelimesini nasıl tanımlıyorsunuz? Loathing Krallığı tek bir parça kullanır. Herkes aynı Farmville parçasını paylaşır. Star Trek Online ve Champions Online'ın her ikisi de tek parça model kullanır, ancak anlık bölgeler kullanır.

Bir SQL veritabanı kullanmak yerine, MongoDB gibi kümeleme ve parçalama için tasarlanmış bir noSQL çözümü de kullanabilirsiniz.
Philipp

1
@JoeWreschnig web oyunları gerçek zamanlı oyunlar değil, çok daha kolay ... Star Trek Online ve Champions Online'ın kaç oyuncunun var olduğundan emin değilim ...
o0 '.

4

İlk hamleniz, oyun sunucusundan doğrudan veritabanı erişimini ayırmak ve sunucunuz için veri hazırlamak için kullanıma özel bir ara katman (ör. XML, JSON) kullanmak olmalıdır. Bunlar, herhangi bir sayıda veritabanını işleyebilir ve daha da önemlisi, uygulamaya özel önbellekleme seçenekleri sunabilir. Yapabildiğiniz her şeyi önbelleğe alın ve db'yi yalnızca gerektiğinde nag yapın. Senaryonuzda mümkün olan en iyi performansı elde etmek için büyük getirmeler yapın ve nadiren birçok küçük sorgu yerine yapın.

Seçtiğiniz veritabanı, kullanılabilir veritabanı kaynaklarında genişletmeyi kolaylaştıran ve sonuçlarınızı daha hızlı sağlayan kümeleri çalıştırmanıza da izin verebilir, ancak bu çok fazla deneyime ihtiyaç duyan bir konudur ve kurulumu ve bakımı için özel bir veritabanı yöneticisi - ve indie bütçe için de değil.


1
Bir veri kümesine erişen birden fazla sunucuya sahip olmayı umduğunu düşünene kadar bu iyi görünüyor - bu, daha fazla koordinasyon olmadan, uygulama tarafı önbelleklerin en iyi oyun hatalarına ve en kötü ihtimalle veri kaybına yol açacak şekilde senkronizasyondan çıkacağı anlamına gelir. Söylediğiniz hiçbir şeye katılmıyorum, ancak orijinal posterin devam etmeden önce sunucular arası tutarlılık sorununu da dikkate alması gerekecek.
Kylotan

Ara katman yazılımı, bir yandan verileri önbelleğe almaktan ve ayrıca veri sağlamaktan sorumlu olan bir veri tünelidir. Ancak, yalnızca sunucuya (asla istemciye) veri sağlar ve sunucu başlangıçta oyunla ilgili tüm ana verileri önbelleğe alır. Bu nedenle, aynı anda birçok veri kaynağı ve birçok veri istemcisi bağlı olabilir. Üzerinde çalıştığım MMO bu şemayı oldukça verimli kullanıyor.
Konrad K.

Bu, sunucular arası tutarlılık sorunlarını nasıl çözdüğünüzü açıklamaz. Bir noktada sunucuların birbirleri arasında senkronize verilere ihtiyaç veya yarış koşulları, rastgele vb keser, yinelenen oyuncuları, kandırılmakta öğeler eksik görevler gibi manifesto var

Veriler asla çoğaltılmaz - her zaman belirli bir nesneden yalnızca bir sunucu sorumludur ve gerektiğinde bu nesneyi başka bir sunucuya iletir. Nesneler, oynatıcı denetim nesnesini de içeren istemci bağlantılarıdır. Ancak, bu bir ana sunucu üzerinden yapılır ve sunucular arasında tartışılır. Bu yüzden iki tür veri ile uğraşıyoruz - veritabanı bilgisi (orijinal gönderimin ilgili olduğu) ve çalışma zamanında oluşturulan ve çok sunuculu bir MMO'da aktarılan oyun nesneleri. Bunların hiçbiri bir yarış durumuna düşmemeli veya uygulama düzeyinde tekrarlanmamalıdır.
Konrad K.

3

Oyun sunucusu ile ilgili: Ortak bir strateji, her sunucunun oyun dünyasının bir bölümünü yönettiği birden çok sunucu kullanmaktır. Her kullanıcının genellikle sadece etrafında neler olup bittiğini bilmesi gerekir, bu nedenle dünyayı bölgeye bölmek mantıklıdır. Bu, maalesef, kapalı bölgelerden ve oyuncular arasında ışınlanmadan oluşan bir dünya yerine sınırsız açık bir dünyaya sahip olduğunuzda çok daha karmaşık hale geliyor. Açık bir dünyaya sahip olduğunuzda, oyuncuları bölgeler arasında kesintisiz bir şekilde aktarmanın bir yoluna ve sunucular arasındaki sınırlara yakın alanları senkronize etmenin bir yoluna ihtiyacınız vardır. Bu zor bir sorun.

Veritabanı ile ilgili: SQL veritabanları genellikle kötü ölçeklenir. Bunlar dağıtılacak şekilde tasarlanmamıştır. Ancak şu anda MongoDB veya Cassandra gibi birden çok sunucuya dağıtılacak şekilde tasarlanmış NoSQL veritabanlarının oldukça yeni bir trendi var . Sadece daha fazla sunucu ekleyerek kapasite eklemeyi çok kolaylaştırırlar. Peki neden tüm büyük oyunlar onlara geçmiyor? Çünkü:

  1. SQL veritabanları 40 yıldan fazladır, bu NoSQL veritabanları sadece birkaç yıldır. Bunları en verimli şekilde nasıl kullanacakları konusunda çok fazla bilgi yok ve gelişimleri hızla ilerliyor. Piyasada çok sayıda rakip ve tamamen uyumsuz ürün var ve bunlardan hangisinin hayatta kalacağına ve birkaç yıl içinde kullanılmayacağına ve sonlandırılacağına dair bir işaret yok. Büyük oyuncuların çoğu, NoSQL veritabanlarının bilinmeyen risklerinden ziyade SQL'in bilinen eksikliklerini tercih ediyor.
  2. SQL veritabanlarından çok farklı çalışırlar ve tüm kalıcılık stratejinizi yeniden düşünmenizi gerektirirler. Bu, tüm yazılım mimariniz boyunca ciddi değişikliklere neden olabilir.

Projeniz zaten çok ilerlediğinde, başka bir veritabanı çözümüne geçmek büyük bir risk ve çok büyük bir zaman ve enerji yatırımı olabilir.


0

Hayır. Bu henüz çözülmemiş inanılmaz zor bir alandır.


Bazı "şablon" ("C ++ tasarım modelleri olarak değil) çözümü olabilir mi? Bol miktarda MMORPG var.
Slav

2
Çoğu MMO, veritabanları için mutlak felaketlerle desteklenmektedir.

Özellikle, MMO'lar genellikle kendi oyun tasarımları için kabul edilebilir şekilde çalışan ancak diğer oyun tasarımları için geçerli olmayan veri kalıcılıklarına çok farklı yaklaşımlara sahiptir. Oyun tasarımı en önemli kısım olduğundan, bir veri kalıcılığı ve dağıtım stratejisi olmadan yeterince belirleyemezsiniz. (Bu şu şekilde yorumlanabilir: "Daha spesifik bir soru sorun, bize ne tür verileriniz olduğunu, ne sıklıkta değiştiğini ve neden tek bir dünyayı birden çok sunucuya dağıtmak istediğinizi düşündüğünüzü söyleyin.")
Kylotan

0

Bunun eski olduğunu biliyorum ama ....

Aslında buna odaklanacak iki alan var.

Uygulamanızı birkaç sunucuya dağıtmanız gerekir. Veritabanınızı birkaç sunucuya dağıtmanız gerekir.

Ve her ikisi için de fazlalık olması gerekir.

Bunun için bazı açık kaynaklı çözümler var. Farmville MemSQL / Couchbase kullanan iyi bir örnektir.


1
Veritabanını birden çok sunucuya dağıtmak kesinlikle çözülmüş bir sorundur. Ne yazık ki, DB erişimlerini minimumda tutan çevrimiçi oyunlar için genellikle önemli bir gereklilik değildir. Aksine, gerçek oyunun birden fazla sunucuya dağıtılması hala çözülmüş bir problem değildir.
Kylotan
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.