Çevrimiçi çok oyunculu oyunla ilgili temel bilgiler [kapalı]


9

Şu anda ac # çevrimiçi çok oyunculu oyun üzerinde gerçek zamanlı olarak çalışıyorum. Amaç, UDP protokolünü kullanarak istemci / sunucu tabanlı bağlantı kurmaktır. Şimdiye kadar oyuncuların hareketleri için UDP ve olaylar için TCP (oyuncu atış, can kaybeden bir oyuncu) kullandım çünkü bu tür verilerin sunucuya bağlı tüm oyunculara ulaşacağından emin olmalıyım. UDP'nin 'güvenilmez' dediğini ve bazı paketlerin kaybolabileceğini biliyorum. Ama TCP ve UDP'yi asla karıştırmamak için her yerde okudum çünkü bağlantıyı etkileyebilir.

Ana soru ağımı nasıl organize etmeliyim?

UDP bağlantısız, kimin kim olduğunu nasıl kurtarmalıyım? İstemcilerin ip adreslerini bir listeye kaydetmeli miyim?

Önemli olaylar için TCP kullanmalı mıyım yoksa UDP mi kullanmalıyım? UDP kullanmam gerekirse, verilerin kaybolmayacağından nasıl emin olabilirim?

Hem TCP hem de UDP kullanarak, her oyuncu için IP'lerini bir listede (UDP için) ve başka bir listede (UDP için) bağlı olan TcpClient'i kaydetmem gerekir. Daha etkili olması için bunu nasıl değiştirebilirim?


@JoshPetrie bu soru yasal "Ana soru ağımı nasıl organize etmeliyim?". Bunu ya da bunu kullanmam gerekiyor. OP birini kullanıyor ve zaten seçmiş olduğu başka bir teknoloji eklemek için tavsiyeye ihtiyaç duyuyor. Yanıt, hangi teknolojinin kullanılması gerektiğine değil, yazılımın boruların şişmesini önlemek, gecikmeyi azaltmak ve temel teknolojiden bağımsız olarak güvenilirliği artırmak için nasıl yapılandırılabileceği konusunda geniş.
Coyote

Ayrıca çok geniş. Soru daha konuyla ilgili olacak şekilde düzenlenmelidir (bunu yapmaktan çekinmeyin, daha eski), sonra tekrar açılabilir.

Yanıtlar:


6

UDP'nin daha az yükü vardır, ancak paketleri bilmeden kaybetme pahasına (TCP'nin ek yükünün bir kısmı, kayıp paketlerin yeniden gönderilmesini sağlar).

Bununla birlikte, UDP kullanımıyla ilgili en büyük sorun, birçok yönetici bunun iyi bir güvenlik uygulaması olduğuna inandığı için tüm UDP trafiğini (DNS hariç) engelleyen birçok site olmasıdır.

Ayrıca, oyuncularınızın her birinin farklı bir IP adresine sahip olacağını varsaymayın - birden fazla kullanıcının aynı internet bağlantısını paylaştığı birçok durum vardır ve okul çocukları oyununuza bağlanırsa, muhtemelen işlerini yapmak yerine ders sırasında nasıl kuracağınızı ve çalıştıracağınızı anlayacaksınız (ve başkalarının yerine bu değerli zamanı oyununuza harcamak istemez misiniz?).

TCP akışınız açıldığında, yine de oldukça verimlidir. Bir sonraki adım, gönderdiğiniz / aldığınız veri miktarını en aza indirmektir ve burada protokol tasarımı devreye girer. Örneğin, aynı komutu yüzlerce bayt XML koduna sarmak yerine her komut için yalnızca birkaç bayt gönderirseniz (örn. "İleri doğru hareket"), genel ağ bant genişliği tüketiminiz daha düşük olur ve daha az CPU döngüsü olur bilgileri işlemek için gerekli (büyük bir XML yığınının sökülmesi ve yorumlanması ve sözdizimi kontrolü ile karşılaştırıldığında birkaç bayt kolayca karşılaştırılabilir).

Kesinlikle birden fazla TCP akışı açabilir ve bunları komutlar için, diğeri grafik aktarımları için, diğeri ses tabanlı sohbet için vb. Gibi farklı amaçlar için kullanabilirsiniz. Bu şekilde, 5-10 alan büyük bir grafiği aktarıyorsanız Farklı bir akışta olacağı için en azından oyuncu komut hareketleri gecikmez (ve yeni hareketli grafiğin indirilmesi bitene kadar varsayılan bir hareketli grafik görüntüleyebilirsiniz, bu her zaman beklemekten daha eğlencelidir).


1
Orijinal soru bir istemci-sunucu modelinden bahsettiğinden, tüm UDP'yi engelleyen "siteler" önemsizdir; Bu müşterinin sorunu ve birçok müşterinin aslında tüm UDP'yi engellediğinden şüpheliyim. "TCP kullanmak, ağa bağlı bir oyun geliştirirken yapabileceğiniz en kötü hatadır! Nedenini anlamak için, TCP'nin IP'nin üstünde ne yaptığını görmeniz gerekir. Bkz. Gafferongames.com/networking-for-game-programmers/udp-vs-tcp
indeed005

@ inde0000: Bunun artıları ve eksileri var - UDP kesinlikle bir performans avantajı sağlıyor, ancak güvenilirlik pahasına (TCP'nin avantajı olduğu yer). UDP engelleme konusunda, müşterinin sorunu olma konusunda kesinlikle haklısınız, ancak birçok kurumsal ve eğitim ortamında UDP'nin (bağlantı noktası 53 hariç) UDP'nin bir güvenlik sorunu olduğunu düşünen clueless yöneticiler tarafından engellendiğini ve böylece istemcinin TCP'ye geri dönme seçeneği, en azından oyuncunun oyunu yaşayabileceği anlamına gelebilir (özellikle ağ bant genişliği yeterince hızlıysa).
Randolf Richardson

@ really0000: Ayrıca, UDP ve TCP karışımı kullanmak da oldukça kabul edilebilir olabilir çünkü TCP düşük öncelikli veri aktarımları için kullanılabilirken, UDP işlerin yüksek hızlı eylem tarafı için kullanılabilir. Ayrıca ilginç bir nokta da IPv6 ile doğada bağlantısız olmamakla birlikte oyunun gerçek zamanlı ihtiyaçlarını karşılayabilecek yeni seçenekler (IPv4 ile mevcut değil) var, ancak IPv6'dan önce bir süre olacağını düşünüyorum. IPv4'e de güvenmek zorunda kalmadan oyunlar tarafından kullanılabilir (bu talihsiz bir durumdur, bu yüzden IPv4 ile şimdilik yapabileceğimiz en iyi şekilde yapıyoruz).
Randolf Richardson

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.