2B yukarıdan aşağıya atıcı üzerinde çalışıyorum ve Quake 3 gibi ağ bağlantılı oyunlarda kullanılan kavramları kopyalamak için elimden geleni yapıyorum.
- Yetkili bir sunucum var.
- Sunucu istemcilere anlık görüntüler gönderir.
- Anlık görüntüler bir zaman damgası ve varlık konumları içerir.
- Varlıklar anlık görüntü konumları arasında enterpole edilir, böylece hareket düzgün görünür.
- Gerektiğinde, varlık enterpolasyonu "geçmişte" biraz gerçekleşir, böylece aralarında enterpolasyon yapmak için birden fazla anlık görüntü elde ederiz.
Karşılaştığım sorun "saat senkronizasyonu".
- Basitlik için, paketleri sunucuya ve sunucudan aktarırken sıfır gecikme olduğunu bir an için yapalım.
- Sunucu saati istemci saatinden 60 saniye ilerideyse, anlık görüntü zaman damgası, istemci yerel zaman damgasından 60000 ms önde olacaktır.
- Bu nedenle, varlık anlık görüntüleri, istemci herhangi bir varlığın hareketlerini gerçekleştirdiğini görmeden önce yaklaşık 60 saniye boyunca toplanır ve oturacaktır, çünkü müşteri saatinin yakalanması uzun zaman alır.
Bir anlık görüntü alındığında sunucu ve istemci saati arasındaki farkı hesaplayarak bunu aşmayı başardım.
// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;
Varlığın enterpolasyonda ne kadar ilerlediğini belirlerken, farkı müşterinin şimdiki zamanına eklerim. Bununla birlikte sorun, sarsıntıya neden olacağı, çünkü iki saat arasındaki fark, diğerlerinden daha hızlı / daha yavaş gelen anlık görüntüler nedeniyle aniden dalgalanacaktır.
Saatleri, algılanabilir tek gecikmenin enterpolasyon için sabit kodlanmış ve normal ağ gecikmesinden kaynaklanan gecikme olacağı kadar nasıl senkronize edebilirim?
Başka bir deyişle, saatler önemli ölçüde senkronize olmadığında, sarsıntı olmadan, enterpolasyonun çok geç veya çok erken başlamasını nasıl önleyebilirim?
Düzenleme: Vikipedi göre , NTP internet üzerinden saatler birkaç milisaniye içinde senkronize etmek için kullanılabilir. Ancak, protokol karmaşık görünüyor ve belki de oyunlarda kullanım için aşırı mı?