En iyi eşler arası oyun mimarisi


10

Oyun istemcilerinin bulunduğu bir kurulum düşünün:

  1. oldukça küçük bilgi işlem kaynaklarına sahip (mobil cihazlar, akıllı telefonlar)
  2. hepsi ortak bir yönlendiriciye bağlı (LAN, hotspot vb.)

Kullanıcılar harici bir sunucu olmadan çok oyunculu bir oyun oynamak isterler.

Bir çözüm, bir telefon üzerinde yetkili bir sunucu barındırmaktır, bu durumda da bir istemci olur. Nokta 1 dikkate alındığında, telefonun bilgi işlem kaynakları yeterli olmadığından bu çözüm kabul edilemez.

Bu yüzden, oyunun simülasyon yükünü müşteriler arasında dağıtacak bir eşler arası mimari tasarlamak istiyorum. 2. noktadan dolayı sistemin optimizasyon açısından karmaşık olması gerekmez; gecikme süresi çok düşük olacaktır. Her müşteri kendisi ve yakın çevresi (örneğin madde işaretleri) hakkında yetkili bir veri kaynağı olabilir.

Böyle bir mimari tasarlamak için en iyi yaklaşım ne olurdu? Bu tür bir LAN düzeyinde eşler arası protokolün bilinen örnekleri var mı?

Notlar:

Bazı problemler burada ele alınmaktadır , ancak burada listelenen kavramlar benim için çok üst düzeydir.

Güvenlik

Yetkili bir sunucuya sahip olmamanın bir güvenlik sorunu olduğunu biliyorum, ancak istemcilere güvenmeye istekli olduğum için bu durumda geçerli değil.

Düzenle:

Bahsetmeyi unuttum: oldukça hızlı bir oyun (atıcı) olacak.

Ayrıca, Gaffer on Games'teki ağ mimarilerini zaten okudum .

Yanıtlar:


10

Age of Empires II'nin ağ mimarisi hakkındaki bu makaleye göz atın .

16 MB RAM ve 28.8 kB / s modem bağlantısı ile Pentium 90'da harika çalışan çok oyunculu bir oyun yaratmayı başardılar. Bunu her oyuncunun kendi simülasyonunu çalıştırmasını sağladılar, ancak komutlarını senkronize ettiler.

Orada bazı akıllı hileler var, kesinlikle tavsiye ederim.


5

Bunu, hem geçici bir ağ üzerinde hem de kablosuz bir hotspot üzerinden çalışan ticari bir PSP yarış oyunu için yaptım. (Veya isterseniz Internet'teki statik bir sunucuya)

2. noktadan dolayı sistemin optimizasyon açısından karmaşık olması gerekmez

Benim tecrübelerime göre, bu doğru değil. Kablosuz aygıtlar (özellikle küçük taşınabilir aygıtlar) kablolu ağ bağlantısına sahip bilgisayarlar gibi değildir - akıllı telefonlar ve kablosuz oyun konsolları, oyun amaçları için yavaş ağ arabirimlerine sahip olma eğilimindedir.

Beni yanlış anlamayın - verimleri genellikle iyidir (yani, saniyedeki veri miktarı; film akışı vb.İçin harika), ancak belirli bir paketin teslim edilmesindeki gecikme son derece kötü olabilir ve herhangi bir paketin ne kadar sürede teslim edileceğini tahmin etmek bile zor olan oldukça değişken. Sinyalleri birbirini etkilemeye başladığı için, daha fazla kablosuz cihaz bir genel alana bir araya getirildikçe bu varyasyon daha da kötüleşir. Bunun sonucunda, gönderilmesi gereken paket sayısını azaltmak için çok fazla zaman harcadım, bu yüzden daha az paket çarpışması yaşayacağız. (Bunun, cihazların doğrudan bir ad hoc ağ üzerinden birbirleriyle doğrudan konuşmasını sağlamak yerine, enerjili bir ağ etkin noktasının söz konusu olması durumunda bunun daha az sorun olduğunu unutmayın)

Bu tür bir optimizasyon örneği olarak, yarış oyunumuz trafik ışıkları olan bir dünyada gerçekleşti. Binlerce. Ve bir ağ oturumundaki tüm oyuncular arasında sinyallerinin senkronize olduğundan emin olmamız gerekiyordu. Herkese hangi ışıkların hangi durumda olduğunu söylemek için paketler göndermeye çalışmak yerine, tüm trafik ışıkları için statik bir program tanımladık ve daha sonra tüm müşterilerin mevcut "oyun zamanı" üzerinde anlaştıklarından emin olduk. Hepsi oyun zamanını bildiğinden ve tüm trafik ışıklarının durumları oyun süresinden belirlendiğinden, tüm bu durum verilerini gerçek bir özel veri göndermeden senkronize ettik. Bu tek değişiklik, ağ performansımız için büyük bir fark yarattı.

Bununla birlikte, birden fazla kablosuz cihaz arasında güvenilir bir saat senkronizasyonu oluşturmak (büyük ölçüde paket kaybına bağlı olarak çok farklı ping süreleriyle) büyük bir zorluktu. İlginiz varsa bunun hakkında daha fazla konuşmaktan mutluluk duyarız.

Her müşteri kendisi ve yakın çevresi (örneğin madde işaretleri) hakkında yetkili bir veri kaynağı olabilir.

Yaptığımız şey bu ve bizim durumumuzda (arabalar) bizim için iyi çalıştı. Sorunlu kısım, elbette, bir nesnenin 'a' oyuncusuna 'b' oyuncusundan daha yakın durmasıdır ve bu nedenle mülkiyeti bir oyuncudan diğerine transfer olur.

Bu aslında 'a' oyununun 'b' oyununu önerdiği 'oyuncular arasında şaşırtıcı derecede karmaşık bir müzakere: "Bence bu nesne size daha yakın. Bunu kontrol etmelisiniz." Ve sonra 'b' oyunu kendi durumuna göre ya kabul edebilir ya da reddedebilir. 'A' ve 'b' arasındaki algılanan oyun durumundaki farklılıklar ve istek ile yanıtın gönderilip alındığı zaman arasındaki değişiklik, bu durumu güvenilir olmak için özellikle kötü bir müzakere haline getirir ve bir oyuna kolayca dönüşebilir "sıcak patates", nesne sahipliği sürekli birden fazla oyuncu arasında etrafında sıçrayan. Ve düzgün çalıştığında bile, 'c' oyununun bakış açısından bakıldığında, orada '

Benim sezgim, bu tür "nesne sahipliği" yaklaşımının, mermi gibi küçük, kısa ömürlü nesneler için çok külfetli olması. Simülasyonda nispeten uzun bir süre yaşamak eğiliminde olan trafik arabaları ve AI yarışçıları için kullandık. Eğer müşterilere güvenmek istiyorsanız, her oyuncunun oyununun kendi pozisyonlarına ve mermilerine sahip olması ve o oyuncunun bir başkasının mermisi tarafından vurulduğunu beyan etmesi daha performanslı bir yaklaşım gibi görünüyor. ("A oyunu" olarak, A oyuncusu ve A oyuncusu mermilerinin nerede olduğunu söylemekten sorumluyum, ancak B oyuncusu B oyuncusuna vurup vurmadığımı söylemekle sorumludur). Bazı iyi ölü hesaplamaları ile, böyle bir sistemden oldukça makul davranışlar elde edebilmelisiniz.


1

Eşler arası mimariyi kilitlemek için kilit adım eşler kullanmanızı öneririm.

Oyun başladıktan sonra oyun karelerinizi sayarak işe başlarsınız. Bir istemci 1. kareyi oluşturur, ardından hazır mesajı diğer istemcilere gönderir ve diğer istemcilerden hazır mesaj almayı bekler.

Şimdi tüm müşteriler 2. kare için gidebilir. Çerçeveyi işleyin, komutları gönderin ve alın, dünyayı güncelleyin, fiziği güncelleyin ve ... sonra birbirlerine mesaj gönderin.

Bu çözüm LAN oyunları için çok iyi ve tüm müşterileriniz senkronize olacak.

bu tür bir ağ ile tüm müşterilerinizin senkronize olduğundan emin olabilirsiniz, böylece ihtiyaçlarınıza en uygun yolu test edebilirsiniz.

1. yol sadece girişleri başkalarına gönderir ve her müşteri, koşma, ateşleme, çarpışma tespiti vb. öğelerini hesaplar ve ağ üzerinden gönderir, ancak ilk yol daha güvenlidir.


1
Bu cevap oyun döngüsü ile ilgili gibi görünüyor. Bence OP yük dağıtım sistemini soruyor; özellikle, müşterilerin neyi ve nasıl iletişim kurduğunu simüle eder . Biraz daha ayrıntıya girebilir misiniz? Ben de bu problemle ilgileniyorum.
Wackidev

@Wackidev bu tür bir ağ ile tüm müşterilerinizin senkronize olduğundan emin olabilirsiniz, böylece ihtiyaçlarınıza en uygun yolu test edebilirsiniz. 1. yol sadece girişleri başkalarına gönderir ve her müşteri, koşma, ateşleme, çarpışma tespiti vb. öğelerini hesaplar ve ağ üzerinden gönderir, ancak ilk yol daha güvenlidir.
kochol

Lütfen bunu cevabınıza koyun. Şu anda soruyu cevapladığını sanmıyorum. Ayrıca, lütfen ilk yinelenen yorumu silin. Teşekkürler. Fikrin kendisine gelince, listelediğiniz ilk seçenek simülasyonun deterministik olmasını gerektirmez mi?
Wackidev
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.