Feragatname: Oyun programlama deneyimim istemci tarafı tek oyunculu oyunlara dayanıyor, ancak web uygulamalarında (özellikle Microsoft yığınında) bir arka planım var, bu yüzden bu cevapla geldiğim yer, çok şey olacağını hissediyorum uygulamak, ama gerçek bir oyun sunucusu gerçek test olmadan nasıl uygulanacağını söylemek zor, ama işte gidiyor. Şunu bilin: Bir oyun sunucusu kurmadım, sadece webapps.
İki (sunucu) katman yaklaşımı öneririm. Bir veritabanı katmanı ve bir "uygulama" katmanı; üçüncü (sunum) katmanı oyun istemcinizdir.
İlişkisel veritabanları, veri sorgulamada mükemmeldir ve veri yazmada iyi olur. Anahtar, veritabanı yazılarınızı kümenizin işleyebileceği yönetilebilir boyut yığınlarına serileştirmektir. SQL Server'ın daha gelişmiş sürümleri (Veri merkezi / Enterprise) kümelemeyi ve çoğaltmayı destekler. Nasıl çalıştığını görmek için küçük bir küme oluşturarak ve buna karşı bazı sorgular çalıştırarak başlardım.
Uygulama katmanında, "imar" veya benzeri bir şey yapıyorsanız, büyük olasılıkla herhangi bir küme ayarlamadan kurtulabilir ve her bölge için bir sunucu kurabilirsiniz. Bölgeleriniz büyürse, her bölge için bir küme oluşturabilirsiniz.
Uygulama katmanı -> veritabanı katmanından veri göndermek için bir serileştirme işlemi oluşturmak isteyeceksiniz. Anahtar, çoklu serileştirme seviyelerinin devam etmesidir. Bunun gibi bir şey :
- Seviye 1: Her X saniyede bir DB'ye kaydedin, kritik veriler içerir:
- Oyuncu Sağlığı
- Oyuncu Eşyaları / Pikapları
- 2. Seviye: Her 2X saniyede bir DB'ye kaydedin, orta düzey veriler içerir:
- Oyuncu konumları
- NPC konumları
- Seviye 3: Mümkün olduğunca seyrek olarak diğer her şey
Bu, yazınızın tutarlı ve öngörülebilir olmasını sağlar, oyununuzun doğasına bağlı olarak, nadiren veritabanı yazımlarınız olabilir. Anahtar, uygulama sunucunuz çökerse, veritabanınızdaki durumdan tekrar çevrimiçi olmanız gerektiğini anlamaktır, böylece her 90 dakikada bir oyuncu envanterini serileştirmek oyuncuları rahatsız edebilir.
Verileri okumak için, uygulama katmanındaki belleğe mümkün olduğunca belleğe yüklemek ve ardından tüm kodunuzun bu bellek havuzunu kullandığından emin olmak istersiniz, arka planda bellek havuzunu veritabanıyla senkronize edebilirsiniz. Joe'nun işaret ettiği gibi, "gerçek zamanlı" işlemlere ihtiyaç duyduğunuz zamanlar olacaktır. Çoğu yazınızı serileştirerek, veritabanı sunucusunda / kümesinde yeterli donanım olduğunu varsayarak, gerektiğinde gerçek zamanlı işlemler yapmak için veritabanınızda yeterli G / Ç'ye sahip olmanız gerekir.