Eşler arası çok oyunculu oyun nasıl yapabilirim? [kapalı]


36

P2p multiplayer oyununu nasıl yapabilirim? Sunucu-az çok oyunculu bir oyun istiyorum. Ama sonra, tüm müşteriler birbirini nasıl tanıyor?

P2p-protokolü dosya aktarımında neden çok ünlü ama çok oyunculu oyunlarda neden olmasın?


Bir p2p oyunda çok ilginç olabilecek şey, daha iyi sosyal yönleri mümkün kılmak için bir MMO'ya uyan bir net kod yapmayı başarmaktır: sunuculara sadece 5'ten fazla oyuncuya sahip şehirler ve partiler için ihtiyaç duyulacaktır. Ne mümkün olduğunu ve ne olmadığını bilmiyorum, ancak şu anda tek şey daha ilginç olduğunu fotogerçekçi grafik ...
jokoon

Ama p2p çok oyunculu oyunlarda oldukça popüler! Kim olmadığını söyledi? Bazı büyük MMO'lar bile p2p kullanıyor
Adam Harte

Yanıtlar:


33

Eşler arası oyunlar genellikle hala bir oyun sunucusuna sahiptir. Oyunu ana oyunlar listesine gönderen ve yeni bağlantılar kabul eden oyun sunucusu. Oyun sahibi ne zaman oyuna yeni bir müşteri kabul ederse, mevcut tüm müşterileri yeni müşteri hakkında bilgilendirerek yeni müşteriye bağlanmalarını sağlayabilir.

P2p'yi uygulamanın en basit yolu bir lobidir. Tüm istemciler bir lobideki (veya sohbet odasındaki) ana bilgisayara bağlanır. Ev sahibi hazır olduğunda oyuncu basmaya başlar ve hepsi aynı anda oyuna girer (genellikle strateji oyunlarında kullanılır). Daha karmaşık bir yaklaşım, oyuncuların orta oyuna katılabildiği ve oyundan ayrılabildiği "drop-in-drop-drop" kullanmaktır, ancak bu bir p2p oyunda uygulamak için çok daha karmaşıktır ve host-göç adı verilen bir özellik gerektirir.

Pek çok oyun, çoğu strateji, spor ve sürüş oyunu dahil olmak üzere, eşler arası ağ kurma özelliğini kullanır. Hemen hemen tüm Xbox360 ve PS3 oyunları p2p networking kullanıyor. İstemci-sunucu mimarisi çoğunlukla birinci şahıs nişancı veya MMO oyunlarında kullanılır.

İstemci-Sunucu genellikle sadece 1 makinenin tüm oyun durumunu bilmediği için uygulaması daha kolaydır, istemciler temelde işlerin düzgün görünmesi için bazı öngörülere sahiptir.

Bir p2p motoru kurduğunuzda, tüm müşterilerin oyun dünyasının tam bir durumuna ihtiyacı vardır ve hepsinin senkronize kalması gerekir.

P2p ve istemci-sunucu mimarileri hakkında daha fazla ayrıntı için aşağıdaki makaleyi okumanızı öneriyorum: Her Programcının Oyun Ağı Hakkında Bilmeleri Gerekenler .

Ve genel olarak ağ oluşturma konusunda yeniyseniz, bu sitedeki diğer harika makaleleri de inceleyin. Glenn bir ağ dahisidir.


13

P2p'nin oyunlarda popüler olmamasının, çoğunlukla gecikmeden dolayı birçok nedeni vardır. Herkes en yavaş oyuncu kadar yavaş. Burada bant genişliğinden bahsetmiyoruz, ping zamanı.

p2p tonlarca veri aktarabilir, ancak bunu oldukça yüksek bir ping ile yapar, oyunların en az ping süresi ile çok az miktarda veri iletmesi gerekir.


13

Eşler arası sistemler ve aksiyon oyunları hakkında ilginç bazı hususlar var. Onları Glenn Fiedler'in bloguna yorum olarak göndermeye çalıştım, ancak görünüşe göre yanlış olduğunu kanıtlamaktan hoşlanmıyor ve onun yerine tüm makaleyi çekti. Okumak istemeniz ihtimaline karşı, İnternet Arşivi'nde.

Yorumun çevrimiçi olmasına izin vermedi, bu yüzden burada alıntı yapacağım:

İlk gönderiden Eşler Arası öneri, zaman zaman biraz saf olmasına rağmen aslında ilginç bir başlangıç ​​noktasıdır: İlk olasılık, sistemi standart bir müşteri / sunucu modeliyle yazınızda belirtildiği şekilde tahminle birleştirmek olacaktır. oyun ağı hakkında. Düşük P2P pingleri, bulundukları yere bağlı olarak oyuncular arasındaki tahmin gecikmesini önemli ölçüde azaltacaktır: Etki çoğu ABD'li oyuncu için muhtemelen görülmeyecektir, ancak Avrupa'da 200+ ping'leri çoğu sunucuda normaldir ve doğrudan bağlantı Tahmin bir Avrupa sunucusunun gecikmesine bağlı.

Sunucusuz gerçek bir P2P yaklaşımı biraz daha karmaşık: Merkezi olmayan ağlara ilişkin temel bir endişe, özellikle simülasyon ağ üzerinden ya da kayan nokta sorunları üzerinden gönderilen komutların biraz zamanlaması nedeniyle kelebek etkilerinden muzdaripse, tutarlılığı sağlamaktır. Bu, en azından periyodik olarak her bir nesnenin durumunu (oyuncular, NPC'ler, ...) ağa bağlamakla mümkündür. Tüm nesneler için aynı anda yapmak bile gerekmez ve her müşteri belirli nesnelere sahip olabilir. Belli bir süre içinde yeterli miktarda ağ oluşturmak, bir nesnenin her senkronizasyonu arasında biriken farkı, bir saniye veya daha fazla senkronizasyon aralıkları için bile alakasız hale gelebilecek kadar hafifletmelidir.

P2P sistemlerinde ikinci sorun güvenliktir, ancak bu durumda nispeten küçük bir düzeltme ile çözülebilir: Müşteriler her fizik nesnesindeki hata seviyesi hakkında bilgi toplamak için fizik simülasyonlarını kullanabilirler. Manipüle fizik her zaman daha büyük bir hataya neden olur, bu nedenle müşteriler şüpheli bir nesneyi kontrol eden akrandan ayrılmak için sadece "oy verir". Ek olarak, fizik olmayan nesneler için kontrol mesajları, istemciler arasında önemlerine göre iletilir: Oyuncu güncellemeleri rastgele olarak iletilebilir, önemli ve seyrek güncellemeler her zaman, ancak yine de rastgele bir oyuncuya gönderilmelidir. Bu şekilde, bir oyuncu farkedilir şekilde aldatmak için bağlı müşterilerin büyük bir bölümünü kontrol etmek zorunda kalacaktır.

[...]

Referans gösterdiğim konuyu http://www.devmaster.net/forums/showthread.php?t=14640 adresinde bulabilirsiniz .

Sanırım biri güvenlik duvarı sorunlarının eşler arası makaledeki konuların birinde olduğunu belirtti. Muhtemel bir çözüm NAT-Punchthrough olacaktır:
- NAT Punchthrough'a genel bakış
- Ağ Adresi Çevirmenleri Arasında Eşler Arası İletişim

% 100 başarı oranı yok, bu yüzden oyunculara yine de bir liman açmasını söylemelisin.


Soruyu yanıtlayan tek kişi için +1, bunun için teşekkür ederim. Bir soru: Devlet balonundaki kelebek etkisi farklarının kontrolden çıktığını söylediniz (bunun kötü yazılmış birkaç Interplay oyununda gerçekleştiğini gördüm). Makineler arasında durumun farklı olduğunu keşfettiğimizde ne yapmalıyız? Starcraft'ı örnek alarak, eğer bilgisayarım bir ünitenin öldüğüne inanıyorsa, ama rakibimin bilgisayarı başka bir ünitenin öldüğüne inanıyorsa? Kimin sözünü almaya karar veririz?
BlueRaja - Danny Pflughoeft

@BlueRaja Starcraft, bunun için iyi bir örnek değil, çünkü motoru% 100 deterministik. Oynatıcı komutlarını yalnızca zaman damgaları ile güvenilir bir şekilde iletmeniz gerekir ve aynı programı paylaşan bilgisayarlar her zaman geçerli durumla aynı fikirde olacaktır. Farklılıkları azaltmanın iyi bir yolu, her bir durumun oyun zamanıyla (fizik çerçevesi veya kene) güncellenmesi zaman damgasını çekmek ve bu karelerin birkaçını alıcı makinede önbelleğe almaktır. (Buna çoğu FPS oyunu, örnekler CS: S ve TF2'dir.) Ayrıca, uygulamaları farklılık gösterebileceğinden önemli bir şey için kayan nokta sayıları kullanmayın.
Tamschi,

Bir motor% 100 deterministik ise (bunu garanti eden fizik kütüphaneleri var.) Ve durumu bilgisayarlar arasında senkronize etmek için çerçeve önbellekleme kullanıyorsa, kelebek efekti 0 olur. (Güvenilir bir bağlantı garanti ettiğiniz sürece) Ek avantajı, hile yapan müşterileri nispeten kolayca tanımlayabilmenizdir, çünkü farklı sonuçlar almanın tek yolu farklı kodlara sahip olmak olacaktır. Ağ performansına bağlı olarak, bunun oyunun her yönü için mümkün olmayabileceğini unutmayın; Enkaz bu nedenle genellikle senkronize edilmez. Hızlı tempolu oyunlar genellikle her şeyi senkronize edemez.
Tamschi,

Blog yazısı o zamandan beri Google’ın önbelleğinden kaybolduğu için, burada Internet Arşivi’nde yer almaktadır: web.archive.org/web/20091120214817/http://gafferongames.com/…
fernozzle 10:15

9

'Eşler arası gerçek' oyununa güzel bir örnek, Starcraft gibi gerçek zamanlı bir strateji oyunu olacaktır.

Yüzlerce ünite / merminin hareket halinde olduğu bir oyunda, ağdaki birim pozisyonlarını / durumlarını diğer tüm oyunculara tekrar tekrar göndermek pratik değildir, bu nedenle buradaki tek çözüm, tüm oyuncuların senkronizasyonda (aynı) simülasyonunu çalıştırmasıdır.

Bir oyuncu bir eylem gerçekleştirdiğinde, komut / sipariş ('zergling X, Y' ye taşı)) diğer tüm oyunculara gönderilebilir, simülasyonun tüm örnekleri tarafından bir saniye sonra kesilir.

Bu durumda, herhangi bir oyuncu bağlantısı kesilirse, oyun devam edebilir - oyunu çalıştırmak için bir sunucuya / ana bilgisayara ihtiyaç olmadığından, kalan oyuncular devam edebilir.

Bununla birlikte, oyunları senkronize etmek önemsizdir, oyun mantığı güncellemeleri için sabit bir zaman çizelgesi kullanmanız ve simülasyonların ayrılmamasını sağlamak için rasgele sayı üreticilerinin kullanımı ve tohumlanması konusunda çok dikkatli olmanız gerekir!


5

Çoğu Gerçek Zamanlı Strateji oyunu (Star Craft serisi, Komutan ve Conquer Serisi) ve birçok FPS oyunu (Call of Duty: Modern Warfare 2) kullandığında, oyunlar için ünlü olmadığını iddia etmek biraz rahatsız edici olurdu.

Oyunun nasıl öğrenildiği, kullandığınız veya yarattığınız çöpçatanlık / lobicilik hizmetine bağlı olduğunu söyledi. Ancak bir kez oyun hakkında bir şeyler öğrense bile, diğerlerinden daha eşit olan bir veya daha fazla arkadaş olabilir. Oynamak isteyen 3 müşterinin, biri açık nat'ın arkasında, 2 tanesi katı (Kapalı) natların arkasında olduğunu düşünün. Açık doğal eş diğer ikisinden bağlantı alabilir. Ancak 2 katı doğrudan birbirine bağlanamaz, açık nat'ın paketleri iletmesi gerekir. Eğer açık oyuncu, oyundan düşerse, o zaman başka bir rölenin bulunması gerekir ya da oyun bozulur.


2

Ayrıca çevrimiçi oyunlar için eşler arası bir ağ çözümü olduğunu iddia eden Badumna'yı (www.badumna.com) da kontrol edebilirsiniz. Oyun durumu senkronizasyonunu dağıtılmış bir şekilde yapıyor gibi görünüyor ve web sitelerine göre bir Flash sürümü geliyor.


1

Muhtemelen bir oyuncu ile koşmak istersiniz (Onu "Host" olarak adlandırırız) yetkili olmayan bir sunucu olarak. Diğer tüm oyuncuların ana bilgisayarlarımızla yaptıkları sonuca ne yaptıklarını bildirmelerini sağlayabileceksiniz ve ev sahibi mesajları diğer oyunculara iletecek.

Muhtemelen, hangi bilgisayarların ana bilgisayar oynatıcısına bağlı olduklarını gösteren bir liste de vermek istersiniz, böylece yeni bir ana bilgisayar açılırsa bir şekilde seçilebilir ve kalan oyuncularla iletişim kurmaya başlayabilirsiniz.

Smartfoxserver belgeleri size yardımcı olabilir ve / veya oyununuz için de kullanmak isteyebilirsiniz. Ayrı bir istemci ve sunucu programına sahip olmak yerine, bunu istemci oyununuza yerleştirdiniz.


1
Bu, p2p kurulumundan daha az ve hazırlıksız bir sunucu / istemciden daha fazla görünüyor.
deft_code

@ caspin Bu, p2p oyunlarının tümü çalıştırılmadığında en fazla olur. Bir oyuncu ev sahibi belirlenir ve gerisi ona bağlanır.
AttackingHobo

2
@Hobo: p2p değil , müşteri / sunucu, nasıl çağırırsanız söyleyin.
'.

1

Bu konuyla biraz ilgileniyorum. Klasik bir istemci-sunucu modeli yerine bir oyun p2p yapmakta pek çok sorun olduğunu söylüyorsunuz. Ancak p2p'nin istemci-sunucu gibi olduğundan eminim ama her arkadaşın sunucu olma şansı var. LAG hakkında, sunucu olarak bir makine daha eklerseniz, birçok müşterinin sunucudan daha fazla olasılık olasılığı vardır, ancak p2p kullanarak lobide fazladan makine bulunmaz ve gecikme testlerini yönetebilir ve minimum ping ile gruplar oluşturabilirsiniz. Trafik oluşturma hakkında, öğrendiğim gibi, istemcilerden daha az iletim yapmasını istemeniz gerekir, yani istemcilerin diğer tüm istemcilerin istekli olduklarını düşünmeleri gerekir.


xbox 360 üzerinde gta4 p2p yani mümkün ve neredeyse hiç gecikme yok

-1

Düşük sistem gereksinimleri ile nispeten basit görünümlü bir mmorpg yapıyorsanız, oyunun klasörünün içeriğine ve dosyaların nelerden oluştuğuna dayalı bir "frekans" oluşturan dahili bir program oluşturmanızı öneririm. Bu, aynı kanallarda aynı "frekans" ile oynamayı sağlayacaktır. Modded, manipüle veya normal istemciler ayrılacak. Bu sadece yerli kesimler veya modlar için işe yarar, ancak bunun tüm "aptal" hilecileri kapsadığından eminim. Bahsedilen bir kişinin belirttiği hata kontrol yöntemi ile birleştiğinde, ölçülmeye gerek yoktur. Bağlantı noktaları giderken, yalnızca 52225 bağlantı noktasını, tetik bağlantı noktaları olmayan yönlendiricilere bağlı tutan bir arka plan işlemiyle kaplamasını sağlayın.

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.