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?
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?
Yanıtlar:
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.
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.
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.
'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!
Ç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.
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.
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.
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.