Çok oyunculu bir oyun için basit bir oyun sunucusu nasıl yapılandırılır?


9

Basit bir oyun için basit bir çok oyunculu oyun sunucusu oluşturmak istiyorum:

Oyunun Command & Conquer'e benzemesi gerekiyor, birkaç tankınız ve birkaç askeriniz var. Bir asker seçebilir ve daha sonra askerin gitmesi gereken haritayı tıklayabilirsiniz. Eğer asker gidemeyeceği bir bölgeye gelirse, etrafta dolaşır. Ve askerler düşmanlar tarafından vurulabilir.

Oyun sunucusunu nasıl yapılandırmalıyım ve istemcide ne yapılmalı?

Yani bir asker X'ten Y'ye hareket ederse, ancak Z yapısının etrafındaysa, sunucunun askerin bulunduğu yeri tam olarak hesaplayabilmesi gerekir (bir düşmanın ona ateş etmesi durumunda) ve müşteri de asker boyama.

Sunucuda ne yapılmalı ve bunun için bir protokol tasarlamam gerektiğini düşünüyorum. Sunucunun oyun durumunu ve zamanı takip etmesi gerektiğini düşünüyorum. Bunun nasıl yapılacağı konusunda önerisi olan var mı? ya da biraz okuma tavsiye edebilir misiniz?

Yanıtlar:


12

Genel olarak bu çok karmaşık bir konudur. İki çelişkili hedefiniz var (en azından her bir oyunu özel bir sunucuda çalıştırmayı planlamıyorsanız):

  1. Hem hile yapmayı önlemek hem de tüm istemcilerin aynı şeyleri gördüğünden emin olmak için sunucuda mümkün olduğunca çok şey yapmak isteyeceksiniz.
  2. Ama aynı zamanda şeylerin adil olmasını istersiniz, yani bir kişinin sunucuya 0 kez ping işlemi yaparken, diğerlerinin ağ gecikmesi varsa, her ikisi de birimlerine aynı anda bir komut verirse, "sunucu" oynatıcısının bir avantajı vardır .

Bunu bir RTS için nasıl çözeceğimizi tam olarak söyleyemem. FPS ateşlememiz için yaptığımız şey, sunucunun bir süre önce tam bir dünya durumunu kaydetmesi ve istemcinin her çekimde zaman damgası bırakmasıdır. "Ateş ettim!" İçin ağ mesajı sunucuya ulaşırsa, sunucu dünyayı geri alabilir ve çarpışma testleri vb. yapabilir.

Çok sayıda birime sahip olmayı planlıyorsanız, sunucunun işlemesi için çok fazla işlem gerçekleştirme sorununa da sahip olursunuz. Bilgisayar korsanlığı veya hile yapmaktan çok endişelenmiyorsanız, istemcilerde yol bulmayı ve bunun sonuçlarını sunucuya göndermenizi öneririm.

Yine başka bir seçenek bunun üzerine peer2peer gitmek olabilir, her müşterinin yerel ekipler için güncellemelerle uğraşmasına izin verebilir, ancak daha sonra kimin neyi neye vuracağını nasıl belirleyeceği sorusu açılır.

Bu projenin ne kadar karmaşık olduğuna ve ne kadar çaba harcamak istediğinize bağlı olarak, en iyi önerim, ön bir şeye karar vermek ve test etmek için üzerinde çalışmaya başlamak olacaktır.


1
Aslında üç (veya belki daha fazla) çelişen amaç vardır. Üçüncüsü performans, tutmak ve gerçek zamanlı bir oyun durumunu tam olarak sunucuda güncelleme çok kaynak kullanır.
Bart van Heukelom

2
Oh, ve diğer oyuncuların gecikmesinin ortalamasına eşit yapay gecikmeyi başlatarak # 2'yi kolayca çözebilirsiniz. Eğer "herkes için kötü yapmak" diye bir çözüm diyebilirseniz, bu demektir.
Bart van Heukelom

@Bart: kısmen doğru, ancak elbette yapay olarak ne kadar gecikme yaptığınızı veya daha yavaş bağlantıların sürekli olarak daha hızlı bağlantıları çok fazla gecikmeye zorlayabileceğine dair bir başlık olmalıdır, bu kesinlikle istediğiniz şeydir.
o0 '.

En iyi yolu bulmak, istemcide yapılırsa sorun değildir, bir kez bulduğu sürece çözümü sunucuya gönderir, bu da tüm hareketlerde olduğu gibi doğru olup olmadığını kontrol eder.
o0 '.

2

Temel olarak iki yaklaşım vardır:

  1. Güvenilir müşteri
  2. Güvenilmeyen müşteri

Güvenilir istemci biraz daha karmaşıktır, ancak hesaplamanızın çoğunu sunucudan kaldırabilme avantajına sahiptir. Sunucu işletim maliyeti, çok oyunculu oyunlar için en büyük sorunlardan biridir ve ölçeklenebilirliğinizi ciddi şekilde azaltır.

İyi bir yaklaşım (yeni başlayanlar için), her oyuncu istemcisinin kendi birimlerini yönetmesine izin vermektir. Bir sonraki adımda, oyuncu istemcilerinin diğer müşterilerin eylemlerini doğrulamasına izin vermek için yedek döngüleri kullanabilirsiniz. Sunucunun mesaj alışverişi yapmak, senkronizasyonu sürdürmek ve kalıcılığı sağlamaktan daha fazlasını yapması gerekmez (örn. Veritabanı).

Bir tür lobi veya sohbet etmeyi planlıyorsanız, bu konuların her birini ekstra bir sunucuda ele alın. Yolda işleri çok daha kolaylaştıracak.


Teşekkürler, bilgilendirici oldu. Güvenilmeyen müşteriler için gideceğim ve sunucudaki işin gerekeceğini düşünüyorum. Başlangıçta çok fazla oyuncum olmayacak.
Jonas

1
"Çok fazla oyuncum olmayacak ..." Bana bu çizgiyi veren ve altı hafta sonra geri gelen geliştiricilerin sayısını sayamıyorum: "Oyunumu oynamak için ödeme yapmak isteyen bu 5000 oyuncum var, ama ölçeklendiremiyorum :( ". Bunu aklınızda bulundurun!
Andreas

9
"Güvenilir müşteri" bir yaklaşım değil, bir hatadır.
o0 '.
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.