Ağ bağlantılı 2D oyunlarda gecikme telafisi


31

Temel olarak fizik odaklı bir sanal alan / aktivite oyunu olan bir 2D oyun yapmak istiyorum. Gerçekten anlamadığım bir şey var. Araştırmadan, sunucunun güncellemelerinin sadece her 100ms'de olması gerektiği anlaşılıyor. Bunun bir oyuncu için nasıl çalıştığını görebiliyorum çünkü eşzamanlı olarak fiziği simüle edebiliyorlar ve enterpolasyon yoluyla tazminat geciktirebiliyorlar.

Anlamadığım şey, bunun diğer oyuncuların güncellemeleri için nasıl çalıştığı. Müşteriler yalnızca her 100ms'de bir oyuncu konumlarından haberdar edilirlerse, bunun nasıl çalıştığını göremiyorum, çünkü 100ms'de çok şey olabilir. Müzikçalar o sırada iki kez yön değiştirmiş olabilir. Birileri bu konuda bir fikir sahibi olup olmadığını merak ediyordum.

Temel olarak bu çekim ve bunun gibi şeyler için nasıl çalışır?

Teşekkürler

Yanıtlar:


58

Uzun cevapları sevmeyenlerin özeti ...

Yapılabilir, ancak herhangi bir gecikme olması durumunda mükemmel çok oyunculu fizik yapmak imkansızdır . Gecikmenin neden fiziği etkilediği açıklanır ve daha sonra gecikmenin fizik simülasyonunuzdaki etkisini azaltmaya yönelik ipuçları sunulur.


Çok oyunculu bir fizik oyunu oluşturmak tehlikeyle dolu olabilir. "Mükemmel" bir çevrimiçi çok oyunculu fizik deneyimi yaratmak mümkün değil. Daha iyi hale getirmek için yapabileceğiniz şeyler var, ancak herhangi bir gecikmeyi varsayarak mükemmel fizik yapmanın bir yolu yok.

Sorun şu ki, fizik gerçekçi olmak için hızlı ve duyarlı olmalı, ancak aynı zamanda TÜM faktörlerin birleşik eylemlerine dayanarak hesaplanmalı - yani tüm oyuncuların birleşik eylemleri. Ve gecikme varsa, bu gerçek zamanlı olarak yapılamaz.

Farklı faktörleri kontrol altında tutabilip alamayacağınıza karar vermek ve gecikme süresi çok yükselirse oyuncunun deneyimlerinin bozulmayacağını anlamak sizin geliştiricinizdir. Bununla yaşayabilir (ve oyuncuların yapabilir), öyleyse devam et. İşleri nasıl daha pürüzsüz tutacağınızla ilgili bazı notlar için bu yazının sonuna bakın.

İşlerin nasıl berbat edilebileceğini gösteren bir örnek

İki oyuncunun (istemcilerin) bir sunucuya bağlı olduğu bir oyun hayal edin. Bir mesajın internetten istemciden sunucuya geçmesi 100 milisaniyede (1/10 saniye) sürüyor. Bir oyuncu bir şey yaptığında, sunucuya ne yaptıklarını söyleyen bir mesaj gönderilir. Sunucu daha sonra mesajı diğer oyunculara yayınlar, böylece oyuncunun ne yaptığını bilirler.

Şimdi, iki oyuncunun yerde fizik nesnesi olan bir kasa olduğu bir senaryo oluşturun. Oyuncu A bir tarafa çarpar ve bir yöne hareket ettirerek gönderir. Bununla birlikte, aynı zamanda, B oyuncusu başka bir yöne vurup başka bir yöne gönderiyor.

Bunu ele almanın farklı yollarına ve sonuçların ne olacağına bakalım ...

Ya fizik sadece sunucuda hesaplanırsa?

Farz edelim ki fizik yalnızca sunucuda hesaplanmış. Oyuncu A sunucuya "Ben bu şekilde sanırım" mesajını gönderir, 10/10. Oyuncu B "Sanırım bu şekilde diğer tarafa vurdum" mesajını gönderir. Sunucu, fizikteki değişimi iki eylemin kombinasyonundan hesaplar ve her iki oyuncuya da "Tamam, bu şekilde hareket eder" diyerek mesaj gönderir. Her iki oyuncunun da hareketlerine dayanarak mükemmel fizik gerçekleştirilir.

Fakat sorun şu ki, her iki oyuncu da sandığın tepkisini görmeden önce saniyenin 2 / 10'u olacak. Her iki oyuncudan gelen mesajlar sunucuya ulaşmak için saniyenin 1 / 10'unu, ardından sunucu hesaplama sonuçlarının her iki oyuncu için gönderilmesi için saniyenin 1 / 10'unu alır.

Alt satırda, laggy oyun.

Ya fizik müşteriden yeni hesaplanırsa?

Diyelim ki sadece müşteride hesaplanmış fizik var. Buna Oyuncu A'nın bakış açısından bakalım. A oyuncusu sandığı vurur ve derhal yönlerine doğru başlar. Sunucuya, Oyuncu A'nın ne yaptığını söyleyen bir mesaj da gönderilir.

Gerçi Aynı zamanda, B onların hit yapmış ve giderek sandık gördü onların yön ve onların yaptıklarından sunucuya bir mesaj gönderdi.

Saniyenin 10 / 10'u, sunucudan istemcilere bir mesaj gelir. A'ya B'nin yaptığı, A'ya yapılanlar söylenir. Sorun, iki müşterinin dediği gibi, "X oyuncusu bu noktada o vuruşta başarılı olmuş olabilir, ancak o yerde artık bir kasa kalmadı, bu yüzden onların vuruşları hiçbir şey yapmadı."

Alt satırda, senkronizasyon dışı iki oyun ve paylaşılan bir deneyime sahip olmayan oyuncular var. İkisi de farklı şeyler görüyorsa, çok oyunculu oyunun amacı nedir?

Fizik hem müşteri hem de sunucu üzerinde hesaplanırsa ne olur?

Bu durumda, fizik müşteride hesaplanır, böylece oyuncular anında gecikmesiz bir tepki görürler, ancak sunucuda da hesaplanır, böylece tüm oyuncular için "doğru" olur.

Her iki oyuncu da sandığı kendi yönlerine vurur ve her biri sandık hareketini yalnızca isabetlerine göre görür. Ama sonra saniyenin 10 / 10'u, sunucu geri döndü ve “Aslında, ikiniz de yanlışsınız. Sandık bu tarafa gitti” diyor. Aniden her iki oyuncu da sandığı sert bir şekilde yön değiştirdi ve yeni bir konuma getirdi.

Alt satırda, bir aksaklık oyunu.

Sonuç

Temel olarak, herhangi bir gecikme olduğunda, birden fazla oyuncuyla mükemmel bir fizik oyunu yapmanın bir yolu yoktur. Oldukça iyi bir oyun yapabilirsiniz, ancak her zaman bazı oyuncular için kötü bir deneyim yaratma konusunda aşırı gecikme riski vardır. Ancak, oyun deneyiminizi iyi tutmak için yapabileceğiniz şeyler var.

Çok oyunculu bir oyunu iyi yapmak için yapabileceğiniz şeyler

Basit çarpışma hacimlerini kullanın. Basit bir küp şeklinin yapacağı bir şeklin her detayını fizikle modellemekten rahatsız olmayın. Bir spikey topunun fizik için bir spikey top olarak modellenmesi gerekmez. Bunun yerine sadece bir küre olarak modelleyin.

Küçük önemsiz nesneleri yalnızca istemci öğeleri yapın. Bir örnek, kırık bir pencereden kırılmış cam parçaları olabilir. Her müşterinin kendi başına taklit etmesine izin verebilirsin ve farklı olup olmadıkları önemli değil.

Nesneleri yalnızca fizik nesnesi yapmaları gerekiyorsa aktif fizik nesne sayısını düşük tutmak için fizik nesnesi olmaları gerekiyorsa yapın.

Çok oyunculu fizik yaparken oyununuzu ağır çekimde çalıştırın. "Kurşun zamanı" düşünün belki. Yavaş hareket oyunları gecikmeyi telafi eder ve birden fazla oyuncunun birlikte fizikle etkileşimine izin verir.

Oyuncuların bir tür durumu birlikte kurmalarına izin verin ve sonra bazı ipuçlarında, fizik iki oyuncu için de simüle edilir ve her ikisi de birleşik eylemlerinin sonucunu izler. Oyuncular tamamlanıncaya kadar diziye müdahale edemezler.

Ayrı oyuncular fiziği böylece birbirlerini engelleyemezler. Bu, aynı anda sadece bir oyuncunun kontrolüne sahip olduğu bowling veya pool gibi bir oyun veya her oyuncunun kendi “sandbox” ını (bowling lane gibi) kullandığı bir oyun için harika olurdu.

Onları yenemezseniz, onlara katılın ve fiziği oyununuzun bir parçası haline getirin. Kırık bir fizik kanunu veya başka bir şeyle dolu karanlık bir evrende olduğun hakkında bir hikaye hayal et :)

Ek: Atış oyunları bununla nasıl başa çıkıyor?

Atış oyunları, aşırı karmaşık fizik yapmamakla başa çıkıyor. İstemci yan etkilerini kullanıyorlar, böylece oyuncular bir şeyleri hızlıca görebiliyorlar, ancak sonra sunucu ne olduğu konusunda son çağrıyı yapıyor.

Bir oyuncunun B'yi vurduğu bir senaryo düşünün. Tipik bir shooter oyununuz böyle bir şey yapacak ...

  1. A, B'ye isabet edip etmediklerini yerel olarak hesaplar ve bir isabet var gibi görünüyorsa, kan pufu gibi bir "isabet" efekti çalar. Bu, müşteri tarafında yapılır, böylece oyuncu hemen eylemlerine bir tepki görür. Bunu yapmazsan, oyun çok garip geliyor.
  2. A ayrıca sunucuya "Bu vektöre ateş ettim" diyen bir mesaj da gönderir.
  3. Sunucu mesajı aldığında, BT'nin oyuncuların nerede olduğunu düşündüğü yere bakar ve A'nın atış vektörünün B'ye çarpıp çarpmadığına karar verir.
  4. Sunucu A vuruşu B'ye karar verirse, B'ye vurulduğuna karar verir ve BOTH müşterilerine ne olduğunu söyleyen bir mesaj gönderir.
  5. Eğer sunucu A'ya BÜTMEME karar verirse, B iyi ve A "özlüyor". A'ya vurdukları gibi görünebilir ("Kan pufunu gördüm!"), Ancak sunucular özledikleri aramalar.

Öyleyse, bir B, onlara çarpmış gibi göründüğünde nasıl özleyebilir? Çünkü B taşındı, ancak A henüz görmedi çünkü sunucu henüz istemciye "B buraya taşındı" mesajı göndermedi.

Valf bu konuda kendi sitesinde iyi bir yazı yazıyor. Bkz http://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


2
Bu iyi bir bağlantıya sahip bir sunucuda doğrudur. Çok oyunculu oyunlarda fiziğin başarısız olduğu birçok durum var ve Garry'nin Mod oyunlarında pek çok kötü fizik tecrübesi olduğuna eminim. Ancak, gecikme olursa, ana hatlarıyla belirtilen konular mevcut olacaktır. Fiziğin pürüzsüz olması için çok hızlı bir şekilde hesaplanması gerektiği gerçeğini çözemezsiniz. Gecikme varsa, bir gecikme olacak. Gecikme gecikme anlamına gelir.
Tim Holt

1
Geri dönüp gönderimi yeniden okumak isteyebilirsin. Benim açımdan ön kısımda bazı düşünceler eksi, Garry'nin Mod oyun oturumları da dahil olmak üzere birden fazla oyuncu ile bir fizik simülasyonunda tam olarak ne olduğunu anlatıyorum. Gerçekleri çözemezsin.
Tim Holt

2
Tamam, aşağı oyumu bir artı oyuna değiştirdim. Ancak, fizikli çok oyunculu oyunlar için, daha önce gerçekten yapıldığı ve nispeten sorunsuz bir hale geldiği zaman, gerçekten olumsuz bir tablo çiziyorsunuz.
Saldırı

7
@AttackingHobo: "Glitch free" görecelidir. İyi bir ağ tahmini olan bir oyun üzerinde çalıştım, şimdi daha önce bulunmadığım aksaklıkları görüyorum. Mekaniği nadiren anlamlı bir şekilde etkilerler, fakat hazırlar. Tahminin tüm noktası, küçük bir gerçek zamanlı yanlışlığın gecikmeli doğruluktan daha iyi olduğudur; bu her zaman yanlış olduğunuz gerçeğini değiştirmez.

1
+1 "Kırık fizik yasaları veya benzeri bir şey ile sıkıntılı bir evrende olma hakkında bir hikaye hayal edin".
Patryk Czachurski

13

Buraya konuyla ilgili bir dizi makale yazdım: http://www.gabrielgambetta.com/fpm1.html

İlk üç makale, konuya giriş, müşteri tarafı tahmini, sunucu mutabakatı ve varlık enterpolasyonu ile ilgilidir (bu, özel sorunuza cevap veren kısımdır). Dördüncü makale (yakında) "çekim malzemesi" ile ilgilenecek :)

Tim Holt'un cevabı oldukça fazla. Makalelerimin neler olup bittiğini anlamanıza yardımcı olacak birkaç diyagramı var, ancak Tim ve ben temelde aynı şeyi söylüyoruz.


İyi şeyler ggambett!
Tim Holt

2
Pek çok oyuncu bu işlerin nasıl yürüdüğünü anlamıyor, ancak ebedi olanı anlamak çok kritik, "WTF NEDEN ÖLİYEDİM?" soru.
Tim Holt

Ya da "karakterim neden o sütuna dev bir lastik bantla bağlı?" bağlantısız bir bağlantıda :)
ggambett

Valve'ın Wiki'sinde bu konulara da değinen bir yazı var. Sayfa developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Tim Holt

1
Canlı Demoyu seviyorum. Olanları görselleştirmek için ne harika bir yol.
Richard Marskell - Drakkir

2

Tepki için kendi karakteriniz üzerinde tam bir tahminde bulunmak ve diğer karakterlerin tutarlılık için 100ms geride kalması makul değildir. Eğer bu kötü görünüyorsa, senkronize olmaları için kendi karakterinizin biraz yavaş kaldığını düşünün. Her iki durumda da gecikme ani durumlarında yanlış tahminleri düzeltmek için hala düzeltme mekanizmalarına ihtiyacınız olacak ve bu sistem tanımladığınız gibi durumlarla ilgilenecek. Gecikme süresinin 100ms mi yoksa 1ms mi olduğu önemli değildir - müşteriniz her zaman bir anlamda 'geç' olur ve bu nedenle her zaman eski verilerle uğraşmış gibi davranmak ve makul görünmesi için enterpolasyon gibi kozmetik etkiler uygulamak zorunda kalır.


0

Sonunda, mevcut ağ kaynakları ile ilgili tüm yapma hakkında. İdeal olarak, sıfır gecikme süresi olan bir dünyada yaşardık ve her şey mükemmel şekilde senkronize edilebilir. Gerçekçi olarak, istemcileri her 100, 200, 300 ms'de bir güncellersiniz ve istemcide olanların sorunsuz görünmesini sağlamak için mantıklı olması gerekir. "Pürüzsüzlük" çok önemlidir, sonunda oyunun sonunda istemci ile sunucu arasında bazı kaotik senkronizasyonlar olsa bile pürüzsüz hissetmek gerekir.

İyi bir yazı ve daha iyi bir cevap bulunabilir:

Bir ağ oyunu nasıl yazılır?


0

Sorun gerçekten gecikme değil. Sebep olduğu herhangi bir sorunu gizlemek için iyi bir şekilde telafi edilebilir ve tahmin edilebilir. Paket kaybı da sorun değil - ağ sistemi paket kaybı için dayanıklı ve tolere edilebilir şekilde yazılmalıdır. Bununla birlikte, sorun gecikme ani ve öngörülemeyen gecikmedir. Senkronizasyondan gelen paketler, bazıları yalnızca gecikme dalgalanmaları nedeniyle düşüyor, gecikme dalgalanmaları vb. Nedeniyle tahmin edilemiyor ve enterpolasyon yapılamıyor.

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.