2010-07-18 19 views
9

XNA'da lidgren ile deneme yapıyorum ve 'gecikme' ile ilgili bazı sorunlar yaşıyorum.XNA + lidgren içinde gecikme ile ilgileniyor

XNA sample numaralı telefonunu indirdim ve örneklerinin bile geçmediğini fark ettim. Mesele şu ki, hareket diğer tarafta pürüzsüz değil ve bunu bir LAN üzerinde (aslında aynı bilgisayarda) internet üzerinden denemiyorum.

Kapaklar ve XNA ile gecikmeli bir bağlantı nedeniyle düzensiz hareketle ilgili olarak aynı sorunlara sahip miydi?

+4

Bu soru konu dışı olması ve gamedevSE 2010 yılında aktif, bu ne zaman gönderildiğini oldu Gamedev.SE – Kromster

+1

taşınmalıdır görünür? –

cevap

30

Doğrudan bağladığınız örnek, ağı ne alırsa alınsın, bu çok oyunculu bir oyun için kötü bir fikirdir!

Gerçek bir oyunda yapmanız gereken, yerel konum ile uzak konum arasında enterpolasyon yapmaktır. Yani, almak yöntem biraz şuna benzer:

void Receive(packet) 
{ 
    unit.RemoteX = packet.Read_X_Position(); 
    unit.RemoteY = packet.Read_Y_Position(); 
} 

Bu, hiçbir yerine güncelleme yöntemi (her kare) 'de, ünitenin üzerinde yerel pozisyon üzerinde hiçbir etkisinin bulunmadığını, uzak konuma doğru yerel pozisyon taşımak :

void Interpolate(deltaTime) 
{ 
    difference = unit.RemoteX- unit.LocalX 
    if (difference < threshold) 
     unit.LocalX = unit.RemoteX 
    else 
     unit.LocalX += difference * deltaTime * interpolation_constant 
} 

daha sonra ünitenin "yerel" pozisyonunu göstermek, bu lagless hareketi şöyle ulaşır:

  1. ünite pozisyonu uzak pozisyonda neredeyse ise, uzak atlayacaktır p (Ancak, laggy görünmeyecek kadar küçük bir mesafe atlayacaktır). Fark atlamak için çok büyükse
  2. , o zaman olmalıdır pozisyona doğru yavaşça hareket ettirin. Yerel ve uzak konumları yakınsama ne kadar hızlı interpolasyon sabit kontrolleri. interpolasyon sabit sıfır ile birim, ağ güncellemelerini yok sayacaktır sabit 1'den ağ konumuna düz teleport olacaktır (ve laggy bakmak) - bu yüzden ünite düzgün hareket ettiğinden

arasında sen yerde bir uzlaşma seçmek gerekir Olması gereken yere doğru, hiç bir gecikme yok gibi görünüyor!

Bu tür bir sistemi uygularken göz önünde bulundurulması gereken başka şeyler de vardır, örneğin, genellikle birimlerin uzak konumlarından ne kadar uzakta olabileceği konusunda bir üst sınır istersiniz, aksi takdirde yerel ve uzak durum bazı durumlar. Eğer çok uzaklarsa (aşırı gecikme durumları haricinde asla gerçekleşmemelidirlerse) oyunu durdurabilir ve çok laggy olduğunu söyleyebilirsiniz, ya da üniteyi dümdüz görünecek şekilde yere atlayınız, ama en azından oyun olacak devam et.

Zeyilname: Bu yanıtı yeniden okunması, bir geliştirme zamanı farklarını izlemek için olacağını düşündüğüm oluyor. Eğer sistemde gecikmenin ne olduğunu (kabaca) biliyorsan, o zaman biliyorsun ki, uzak bir pozisyona sahip bir paket aldığında, paketin ne kadar geçmiş olduğunu bilirsin. Uzak hız da gönderirseniz, nesnenin şimdi nerede olduğunu tahmin edebilirsiniz (sabit hız olduğu varsayılarak). Bu, bazı oyunlarda, bazı oyunlarda (çok sayıda değişen hızınız olduğunda) tahmini yerel durum ve gerçek uzak durum arasındaki farkı daha da kötüleştirebilir.

+0

+1: Cevabınız için teşekkürler; –

+0

bilmek için bana bir fikir ver: D – Martin

+0

Bu cevabı kabul ederseniz güzel olurdu;) – Martin

1

Çok oyunculu bir fps oyunu yazmaya çalışıyorum, sadece bazı küpleri hareket ettirme ve bir izleyici modunda olan başka bir makinenin konumunu/rotasyonlarını çoğaltma demosuyla başlıyorum.

Ben yukarıdaki kod örneğini kullanıyorum ve iyi çalışıyor (Ben pürüzsüz görünmesi için 1'den sabit yüksek interpolasyon çimdik yaşadım).

ben dikkate şimdiki zaman ve alınan iletide zaman damgası arasındaki zaman farkını almak birkaç enterpolasyon örneklerini gördüm.

Bu kod saat farkını kullanmaz göreceğinden, interpolasyon hedef değeri elde etmek için, sürece ihtiyacı olarak alacaktır (veya en azından eşik değer içindeki ardından konumuna çıt diye). Sorum şu, bunun bir avantajı var mı?

Çok teşekkürler.