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.
Valve, Gafferon ve Gambetta'yı okudum ve müşteri tahmini için Gambetta algoritmasını uyguladım :
İ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:
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ı?