İstemci tarafı tahmini olan hareketli nesneler nasıl telafi edilir?


11

Star Control benzeri yakın dövüşleri destekleyen bir oyun sunucusu uyguluyorum . Böylece, hareket etmek için süper basit hız / hızlanma / nemlendirme fiziği ile uçan ve ateş eden gemileriniz var.

resim açıklamasını buraya girin

Valve, Gafferon ve Gambetta'yı okudum ve müşteri tahmini için Gambetta algoritmasını uyguladım :

resim açıklamasını buraya girin

İstemci tahmini, oyuncu gemisinde, sunucudan konumunu güncelleyerek ve daha sonra henüz işlenmemiş sunucu girdisini oyuncu gemisine yeniden uygulayarak çalışır.

Maalesef, oyunum için iyi çalışmıyor. Bunun Gambetta örneğinin halihazırda hareket eden nesneleri veya adım adım güncellenen komutları dikkate almadığı gerçeğiyle ilgili olduğuna inanıyorum. ("adım" ile kastediyorum). Bu yüzden oyunumda oyuncu, istemcide hareket etmeye devam eden (zaten hareket eden) gemiyi hızlandırmak için basar, komutu sunucuya gönderir ve genellikle bir sonraki adımda sunucudan dünya anlık görüntüsünü alır. Daha fazla bir şey alıyorum:

resim açıklamasını buraya girin

Player komutu istemci 3. adımda çalışır , ancak sunucuda yalnızca sunucu 5. adımda çalışır . İstemci adım 6'da müşteri tarafından dünya anlık görüntüsü alındığında , tahmin özellikle daha hızlı hızlarda sonlandırılır.

Sorunun temel noktası, istemcinin komutu 5. adımda çalıştırması, ancak sunucunun 6. adımda çalıştırmasıdır . Belki komut ile istemci adım göndermek düşündüm ve sunucu geri almak ve istemci zaman adım ile komutu yeniden çalıştırmak var. Bu, geri alma işleminden beri alınan komutlara ne olduğu veya hile yapan istemcilerin gönderilen adımı değiştirerek nasıl yararlanabileceği gibi bir takım başka sorunlara yol açabilir.

Google gibi bunun gibi videoları okumak ve izlemek farklı bir yaklaşımdan bahseder; burada oyuncu konumunu birkaç adımda anlık görüntünün konumuyla eşleşecek şekilde kademeli olarak değiştirirsiniz.

Sorularım:

  • Gambetta algoritmasının sabit adım hareketi ile çalışmasını sağlayabilir misiniz? Yoksa kavramsal olarak oyunumla uyumsuz mu?

  • Adımlar üzerinde kademeli enterpolasyon o zaman doğru yol mudur? Eğer öyleyse, halihazırda hareket eden bir nesneyi, sunucudan yeni alınan nesneyle eşleştirmek için istemci konumundan nasıl enterpolasyon yaparsınız?

  • Bu yöntemler, kademeli enterpolasyon ve Gambetta algoritması birlikte çalışabilir mi yoksa birbirini dışlar mı?


Ben de aynısını yapıyorum ve aynı problemle karşılaşıyorum. Sunucu durumunu uygulayan ve girdileri yeniden uygulayan hızları ekler eklemez zaten ele alınan hız değişikliklerinden kurtuldum. Son alınan mesajdan bu yana tüm güncellemeleri yeniden uygulamaya çalışıyorum ancak henüz çok düzgün değil. Hiç buna bir çözüm buldunuz mu?
MakuraYami

@MakuraYami Evet - Çözümü açıklayan bir makale yazmaya başladım. Yakında güncellenecek!
OpherV

Projem üzerinde daha çok çalıştım ve kullanışlı bir çözüm buldum ve bu konuyla ilgili daha iyi kaynaklar buldum. Daha fazla tartışmak, çözümleri karşılaştırmak, vb.
İlgileniyorum.

@makurayami Gmail'deki kullanıcı adım
OpherV

Yanıtlar:


5

Bu soruyu sorduğumdan bu yana geçen 6 ay boyunca, bu sorunla (ve diğer birçoklarıyla) başa çıkmak için eksiksiz bir açık kaynaklı oyun sunucusu geliştirdim: http://lance.gg

resim açıklamasını buraya girin

İlgili Ar-Ge artık kendi sorularıma cevap vermeme izin veriyor:

  • Gambetta algoritmasının sabit adım hareketi ile çalışmasını sağlayabilir misiniz? Yoksa kavramsal olarak oyunumla uyumsuz mu?

    Varlığın hareketi belirleyici olmadığında (müşterinin POV'sinden) Gambetta'nın algoritması çalışmaz. Bir varlık fizik veya diğer oyuncular tarafından girilmeden etkilenebiliyorsa, örneğin daha elabroat bir yaklaşım benimsenmelidir.

  • Adımlar üzerinde kademeli enterpolasyon o zaman doğru yol mudur? Eğer öyleyse, halihazırda hareket eden bir nesneyi, sunucudan yeni alınan nesneyle eşleştirmek için istemci konumundan nasıl enterpolasyon yaparsınız?

    Bu, sunucu güncellemelerinin istemci mutabakatı olan farklı bir konuya değinir. Kademeli enterpolasyon işe yarar , ancak söz konusu gibi çok hızlı tempolu oyunlar için aslında ekstrapolasyon uygulamak daha iyidir

  • Bu yöntemler, kademeli enterpolasyon ve Gambetta algoritması birlikte çalışabilir mi yoksa birbirini dışlar mı?

    Birlikte çalışabilirler, ancak yalnızca varlık hareketi müşteri POV'sinden deterministikse. Bu nedenle varlık, fizik veya ekleme, sürükleme vb.Gibi psuedo-fizikten etkilenirse işe yaramaz.


1

Oyununuz zaman adımları açısından düşünmek için çok "gerçek zamanlı" gibi görünüyor. Ben sadece oyun "sıra tabanlı" olarak kabul edilebilir eğer "dönüşler" açısından düşünürdüm. Aksi takdirde, dönüşler veya adımlar fikrini terk edin. O zaman her şey daha kolay olur :)

Oynatıcınız için yerel olarak tahmin ettiğinizi ve yalnızca diğer varlıklar için enterpolasyon yaptığınızı unutmayın (serinin 3. makalesinde açıklandığı gibi). Halihazırda hareket eden nesneler için sunucu güncellemelerini ele almanın yolu, 2. makalenin alt kısmında (bağlandığınız) açıklanan sunucu tarafı mutabakatıdır.

Bu yardımcı olur umarım :)


Sadece açıklığa kavuşturmak için - "adım" ile "saniyede 60 kez çalışan" kare "demek istiyorum. Gerçek oyun ilerlemesini oluşturma işleminden ayırmak için adım (ve çerçeve değil) diyorum ve ideal olarak her ikisi de saniyede 60 oranında senkronize ediliyor. Zekice çalışan sunucu tarafı mutabakat sürümünüzü zaten uyguladım. Bu soru sadece, oyuncu komutuna bakılmaksızın sürekli hareket eden oyuncu gemisini ifade eder (inertion nedeniyle). Zorluğum burada yatıyor. Bunun hakkında bir fikrin var mı? :)
OpherV

Çerçeveler adımlardan farklıdır. Adımlar sabit, öngörülebilir bir sırada hareket eder. Çerçeveler değişken bir süre boyunca hareket eder, bu nedenle herhangi bir ilerlemenin o karenin delta süresi ile çarpılması gerekir.
Tealr

@Tealr, bu yüzden başlamak için "adım" terimini kullandım - sadece "adım" kullanımının sıra tabanlı oyunlarla sınırlı olmadığını daha açık hale getirmek istedim ve oyunumda bir adım tam olarak 1 / 60 saniye içinde render işlemi ne olursa olsun.
OpherV

Kendi denemem için not ettiğim bir şey: 1/60'lar. alışılmadık derecede hızlı ve 1x1'den fazla katılımı olan çoğu çevrimiçi oyunun 1 / 10'larda çalışacağına bahse girerim. güncellemeler veya hakkında.
Patrick Hughes
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.