Bullet kullanırken fizik ağ üzerinden doğru senkronize edilmiyor


11

Bullet kullanarak bir istemci / sunucu fizik sistemi uygulamaya çalışıyorum ancak senkronize şeyler almakta sorun yaşıyorum.

Oyun nesnelerimden dönüşümü okuyan ve yazan özel bir hareket durumu uyguladım ve yerel olarak çalışıyor, ancak ağa bağlı oyunlar için iki farklı yaklaşım denedim:

  1. İstemcide sunucu üzerinde bulunan dinamik nesneler (örneğin rastgele enkaz ve diğer önemsiz şeyler) kinematik yapılır. Bu doğru çalışıyor ancak nesneler çok düzgün hareket etmiyor
  2. Nesneler her ikisinde de dinamiktir, ancak nesnenin taşındığı sunucudan gelen her iletiden sonra, sunucudaki değerlere doğrusal ve açısal hızı ayarladım ve sunucudaki dönüşümle btRigidBody :: progressToTransform'u çağırın. Ayrıca btCollisionObject :: enable (true); nesneyi güncellemeye zorlamak.

Yöntem 2 ile niyetim, temel olarak yöntem 1 yapmaktı, ancak Metodu 1 yöntemini düzeltmek için kendimi yapmak yerine fakir bir adamın tahminini yapmak için kaçırmaktı, ancak bu işe yaramadı (% 100 net olmayan nedenlerden dolayı) hatta Mermi'nin arasından geçiyorum) ve nesneler bazen farklı yerlerde ortaya çıkıyor.

Doğru yönde mi gidiyorum? Bullet'in kendi dahili enterpolasyon kodu var gibi görünüyor. Bu yöntem 1'in daha iyi çalışmasına yardımcı olabilir mi? Yoksa yanlışlıkla stomping çünkü benim yöntem 2 kod çalışmıyor?

DÜZENLEME: Yöntem 1 ile ilgili bir diğer sorun, çarpışma yanıtı senkronize olmayan nesnelere karşı çarpışmalar için yol olacaktır olmasıdır. Kinetik cisimler bazen geri alınamayacakları için sonsuza dek ateş ederler.


Yanıt almanıza yardımcı olabilecek birkaç şey: Hangi dili / motoru kullanıyorsunuz? Ne tür bir bağlantı? Senkronizasyon açığı sunucuya ping ile karşılaştırıldığında ne kadar kötü?
Fibericon

2
İkinci seçenek çalışmaz, çünkü sunucu değerlerine sadece birkaç kareden sonra hızları ayarlarsınız, böylece her paket arasında nesnelerin sürüklenebileceği birkaç kare vardır. Gaffer'in oyun fiziği hakkındaki tüm yazılarını okumanızı tavsiye ederim, muhtemelen ilk önce 'zamanınızı düzeltmeyi' okumalısınız, ancak burada ağa bağlı fizik hakkında konuşan son makale gafferongames.com/game-physics/networked-physics
Roy T.

C ++ 'da kendi geliştirdiğim bir motor kullanıyorum. Ancak eminim senkronizasyon açığı o kadar da kötü değil, muhtemelen ping üzerinde 1 kare tahmin etmek zorunda kaldım ama hala çoğunlukla LAN testi yapıyorum. Bu makalelere göz atacağım ve evet, hızların kapalı olduğu konusunda haklısın. Ancak sandık harita üzerinde olduğu gibi işler yolunda değil . Dönüşümün açıkça ayarlanması, her şeyin sonunda uygun olmasını sağlamamalı mı? (henüz güzel olmasa bile, jiggles vb.)
Lucas

Gaffer'ın gönderisini okudum ve bilgilendirici oldu, ancak daha çok çalıştığım bir şey olan oyuncu hareketi ile uğraşmış gibi görünüyordu. Ben etrafta okudum ve benim yöntem 2 kodu pratik Unreal motor kullanılan yöntemle aynı gibi görünüyor . Çok fazla ayrıntı vermiyorlar ama fikrin sağlam olup olmadığını merak ediyorsun ama Bullet'i kullanmam yanlış.
Lucas

Kısmen konunuzla ilgili ilginç bir okuma: gamasutra.com/view/feature/3094/… . Bu bir rts ve onun fizik ile ilgili değil, ancak sunucu ve istemciler üzerinde bir simülasyon senkronize etmek zorunda oldukları noktaya geliyoruz. Bunu nasıl yapıyorlar? Hem istemci hem de sunucuda bağımsız simülasyonlar çalıştırırlar, ancak sunucu, istemci simülasyonunun ayrılmadığından ve gerçekleşirse düzeltildiğinden emin olan paketler gönderir ...
tom van green

Yanıtlar:


4

Doğru müşteri tarafı tahminine ihtiyacınız var .

Roy T.'nin yorumunda verdiği bağlantıyı gerçekten ayrıntılı olarak okumalısınız . Oyuncu girişi ve karakter fiziği ile ne yapılacağını açıklar, ancak prensip "sunucu güdümlü fizik" için aynı kalır.

Senkronize edilmesi gereken oyun nesneleri için bu uygulanması önemsiz değil, birkaç kelimeyle:

  • Hem sunucuda hem de istemcide fiziği çalıştırın;
  • Sunucu düzenli olarak güncellemeler gönderir;
  • İstemci, fizik dünyasını sunucu değerlerine göre sürekli ve sorunsuz bir şekilde yeniden ayarlar.

Yani evet, yöntem 2 ile doğru yönde gidiyorsun. Sadece değerleri geçersiz kılmak yeterli değil, ancak istemcide atlar alacaksınız, yapmanız gereken düzgün ve sürekli sunucu değerleri ile enterpolasyon.

Gerçek hatanız için, Bullet'e aşina değilim, ancak muhtemelen bazı değerleri kaçırıyorsunuz, örneğin doğrusal ve açısal hızları ayarladınız, ancak ivmeleri ayarladınız mı?


Teşekkürler! Bu bana doğru yolda olduğumu daha iyi hissettiriyor. Şimdi kodumu ince bir diş tarağı ile geçeceğim. Belki bazı bildirimler tetiklenmiyor veya yöntem 2'nin (sarsıntılı) çalışması gerektiği için bir değer eksik olduğumu söylediğiniz gibi.
Lucas

3

Kişisel olarak yaptığım şey, oyunu kim barındırıyorsa, fizik dünyasını yaratır ve nesneleri müşterilerle senkronize eder. Bir p2p ağ şeması olsa bile, fizik motorunu oyuncu istemcilerinden birine dayandırıyorum.

Tamamen göz şekeri kullandığım diğer fiziklerin senkronize edilmesine bile gerek yok.

"Boilerzerker" adlı bir süre önce yaptığım bir prototipte, fiziği ana bilgisayar üzerinde çalıştırdım ve parçacık efektleri (fizik de kullanıyor) bir ağ üzerinden senkronize değil, göz alıcı oldukları için her müşteri için bağımsızdı.


Teşekkürler, evet bu konuda bir yol var. Bununla birlikte, istemcinin yaptığı şeylere karşı istemcide güzel çarpışma yanıtları ile sonuçlanmaz ve aynı zamanda göz şekerleri her zaman doğru etkileşime girmez, çünkü sunucu şeylerini geri itemez (en azından bu zaman aralığında). Unreal ve Source gibi motorlar bunu yapıyor gibi göründüğü için bunun mümkün olduğunu hissediyorum.
Lucas

göz şekerinin senkronize edilmesi gerekmez, müşteri başına hesaplanabilir. istemcideki yanıt sunucuda hesaplanır, istemcinin koordinatları hesaplanır ve geri gönderilir, istemciye çarpıştığını söyleyen bir geri arama göndermezsiniz, bu muhtemelen korkunç görünecektir.
tsturzl

2

Şebeke senkron fizik dünyalarını uygulamak imkansızdır. Adım N'deki küçük fark, adım N + 1'deki çok daha büyük fark Senkronize olmasını ve gerçekçi görünmesini sağlamak için kuvvet veya dürtü uygulayamazsınız.

Çözümler: -

  1. Karakterler veya yarış arabaları gibi sadece birkaç nesneyi özellikle kinematik ise senkronize etmeyi düşünebilirsiniz. Ancak dünyanın büyük kısmı gerçekçi görünmek için senkronize olmaz.

  2. Sunucuda bir fizik dünyasına sahip olabilir ve nesne konumlarını ve hızlarını istemcilere yayınlayabilirsiniz.


Dünyaların senkronize olmadığını görmek için fizik ile bazı ağ oyunları oynamaya çalışabilirsiniz. Örneğin Need For Speed ​​World ücretsizdir ve çok oyunculu ve temel fiziğe sahiptir. (yoldaki kutular ve yıkılabilir nesneler)
Max

Seni tam olarak takip ettiğimden emin değilim. Bunun mümkün olduğuna eminim çünkü birçok oyun oyuncuların kasalar atmasına izin veriyor (örneğin). Seçenek 2, seçenek 2'ye benzer gibi görünüyor, ancak nesneleri sunucu konumlarına temiz bir şekilde yapıştırmak için Bullet'i alamıyorum. Belki de bu benim temel sorunumdur?
Lucas

1
Hayır. Genellikle senkron yanılsamasıdır. Ekranları karşılaştırırsanız, kutularda zıpladığınızda kutuları farklı yönlerde uçtuğunu göreceksiniz. veya kutular fizik değildir (sadece animasyonlar). Kutu sayısı farklıdır. Animasyon dediğimde, hareketlerin arkasında fizik animasyonu olmadığını kastediyorum. Çeşitli hile yapmazlar, görüntüyü senkronize bir şekilde gösterirler, ancak senkron fizik dünyaları değildir. Farklı oyunlarda nasıl hareket ettiklerine bakmalı ve karşılaştırmalısınız.
Max
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.