fizik ile çok oyunculu ağ


12

Yarış oyunlarında fizik ile çok oyunculu ağın nasıl uygulandığını merak ediyorum. Farklı insanlar tarafından kontrol edilen çok hızlı hareket eden araçlarla fiziksel bir dünyamız var. Diyelim ki araçların silahları var ve birbirlerini vurabiliyorlar (Twisted Metal, Vigilante v8)

Vuruşlar ve çarpışmalar konusunda endişeliyim. Yetkili sunucu mu yoksa daha iyi bir alternatif mi?

Yanıtlar:


5

Genellikle, İstemcilerle periyodik olarak paylaşılan "hakikat" durumunu saklayan bir Sunucu kullanılır. Çarpışmalar, İstemciler ve Sunucularda bağımsız olarak gerçekleşir; Müşterilerin durumları, genellikle Ölü Hesaplaşma olarak adlandırılana benzer bir işlem kullanarak önceki durumlardan tahmin edilir . Bir Sunucu durumu bir İstemciye ulaştığında, farklılıklar varsa, İstemci geçerli durumundan çoğunlukla enterpolasyon yoluyla alınan duruma geçiş yapar.

Bununla birlikte, birçok nesne ile çarpışma gerçek bir sorun olabilir, bu nedenle yaygın olarak yapılan, çeşitli ek esneklik derecelerine izin vermek için Müşterilerin simüle edilen zamanını Sunucunun simüle edilen zamanının biraz gerisinde tutmaktır. Valve'in Source Engine net koduyla ilgili bu makale oldukça açıklayıcıdır. Ayrıca, hangi ağ ara katman yazılımını / kitaplığını kullanacağınız konusunda hala kararsızsanız, RakNet'e ve onun "ReplicaManager3" bileşenine bakmanızı öneririm .


2

Yapabileceğiniz birkaç şey var.

  1. Sunucudaki tüm fizik nesnelerini merkezileştirebilir ve tüm istemcilerdeki oyuncu nesnelerine koordinatları senkronize edebilirsiniz. Bu en kolay olanıdır ve birçok kusuru olmadan çalışır, ancak çok fazla kaynak kullanır ve çok fazla bant genişliği gerektirir. Bant genişliği kullanımını, yalnızca belirli bir yarıçap içindeki diğer oynatıcıların oynatıcısına değerler göndererek optimize edebilirsiniz.

  2. Neenster'in belirttiği gibi yapabilir ve sunucunun ve istemcilerin fiziği simüle etmesini sağlayabilirsiniz, çoğu zaman sunucu istemcileri düzeltir. Bu, tüm istemcilerin her oyuncu için kendi fiziğini hesapladığı ve her istemcideki her oyuncunun yörüngesini veren tuş basma olaylarını sunucu üzerinde senkronize edeceğiniz anlamına gelir. Her biri diyelim ki sunucu fizik simülasyonunu 5 saniye yayınlıyor ve tüm müşteriler değişikliği kabul ediyor. Bu, çoğu zaman fark edilmeyen hafif ofsetler oluşturabilir, ancak ağ gecikmesi ve paket kaybı sırasında (yüksek trafikli UDP ile kaçınılmaz), oynatıcınızın ve / veya diğer oyuncuların ekranın etrafında saptığını ve pozisyonu hızla ve dolambaçlı olarak değiştirdiğini fark edersiniz ( kelime?).

  3. Her müşterinin kendi fiziğini hesaplamasını ve koordinatlarını senkronize etmesini sağlayabilirsiniz. Bu, istemciler arasında paylaşılan nesneler üzerinde fiziği simüle etmeyi zorlaştırır. Zarif bir şey yapmak istiyorsanız uygulamak oldukça karmaşık bir kavramdır, çünkü belirli nesne mutlaka herhangi bir müşteriye ait değildir.

Birincisi muhtemelen en kolay olanıdır ve az gecikmeli yaklaşık 4-5 oyuncuya sahip olmanıza izin vermelidir. Her eşleşmenin kendi sunucusu olması gerekir. LAN maçları yapıyorsanız, bu eller aşağı gitmek için yoludur.

İkincisi muhtemelen en pratik olanıdır, ancak uygulanması zor olabilir. Sunucuda fizik simülasyonları çalıştırmak da oldukça beceriklidir. Merkezi sunucularınız varsa, muhtemelen birkaç makineye bakiye yüklemeniz gerekir, belki bir sunucuyla 10 eşleşmeye izin verin, en az eşleşmeyle sunucuya yeni eşleşmeler yükleyin.

Üçüncüsü kesinlikle sunucudaki en az stresli ve eşler arası ağ şemasını yapıyorsanız muhtemelen en iyi çözümdür. Bahsettiğim gibi, oynatıcı nesneniz dışındaki nesneleri senkronize etmek zor olabilir, çünkü bu nesneler diğer istemciler tarafından da değiştirilebilir.

Hangisini kullanacağınızı söyleyemem çünkü oyununuzun nasıl çalıştığını bilmiyorum. Tek yapabileceğim size gerçekleri vermek. Başka sorunuz varsa yorum yapmaktan çekinmeyin.


Müşterilerin fiziğini yapmasına izin vermenin kabul edilebilir bir çözüm olduğunu, ancak hile ile ilgili olmadığınızı ileri sürüyorsunuz.
cubuspl42

@ cubuspl42 Konu üzerinde kalma çabası için detayları atladım. OP'nin hile yapmayı azaltmanın potansiyel yollarını keşfetmek için çözümü daha fazla araştırabildiğini düşünüyorum.
tsturzl

böyle bir yol, her müşterinin sağladığı bir sapmanın bir eşik ile sınırlanmasını sağlamaktır. Örneğin, çoğu müşteri, verilen bir nesnenin 5,8 veya 6,9 pozisyonunda olduğunu ancak bir kişinin koordinat olarak 12,19 rapor ettiğini, bunun diğer istemcilerden ne kadar saptığına kıyasla bir eşikten düşebileceğini söylüyor. Bu sadece kısmi bir çözümdür, ancak çoğu oyun hile için sadece kısmi çözümler sunar, bu yüzden hala neden olur. Bu çözüm, hile yaptıkları anlamına gelmez, ancak konumlarının düzeltilmesi gerektiği ve onlara gecikme olarak görüneceği anlamına gelir.
tsturzl

Biraz katılmıyorum. Bazı hileler düzeltilebilir, bazıları değil. Örneğin, bence rekabetçi bir çevrimiçi atıcı için bir hız saldırısı yapabilirse kötü bir oyun tasarımı. Ya da bir godmode ve sonsuz cephane ile haritanın etrafında uçmanıza izin veren çılgın bir kesmek (Crysis 1'de bir noktada olduğuna inanıyorum). Bunlar düzeltilebilir, sadece oyununuzu doğru bir şekilde tasarlayın. Wallhack gibi şeyler neredeyse düzeltilemez (sunucudan çok büyük kaynaklar gerektirir). Aimbot neredeyse sabit değildir. Çözüm # 3, bu tür kötü hileler riskini artırır.
cubuspl42

@ cubuspl42 Bence bir örneğin ne olduğu fikrini kaçırıyorsunuz. Seçenek 3, bahsettiğiniz sorunu tam olarak önleyebilir. Genellikle hızı paylaşan bir TCP'ye sahip olursunuz ve daha sonra istemciler arasındaki hızı kolayca kontrol edebilir ve bir fikir birliği oluşturabilirsiniz, ayrıca istemcilerinizin bir senkronize saat (HW saatinden bağlantı üzerine kurulabilir).
tsturzl
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.