Multiplayer oyunlarda diğer oyuncuların hareketi neden interpolate edilir? Rollback netcode nasıl çalışır?
Cevap
Server veya peer'lardan gelen güncellemeler saniyede sınırlı sayıda (ör. 20–30 Hz) ve değişken gecikmeyle gelir. Pozisyonları geldiği anda uygulamak titreme ve ışınlanma görüntüsü yaratır. Bu yüzden uzak entity'ler geçmişte biraz geriden gösterilir.
Entity interpolation
Client gelen snapshot'ları zaman damgalarıyla bir buffer'da tutar ve render zamanını şimdi - interpolasyon gecikmesi (genelde 2 snapshot aralığı, ör. 100 ms) olarak seçer. Bu zamanı çevreleyen iki snapshot arasında lerp yapılır.
// renderTime = serverTimeEstimate - interpDelay
for (int i = 0; i < buffer.Count - 1; i++)
{
var a = buffer[i]; var b = buffer[i + 1];
if (a.time <= renderTime && renderTime <= b.time)
{
float t = (renderTime - a.time) / (b.time - a.time);
transform.position = Vector3.Lerp(a.pos, b.pos, t);
transform.rotation = Quaternion.Slerp(a.rot, b.rot, t);
break;
}
}Paket kaybında buffer biterse kısa süreli extrapolation (son hızla tahmin) yapılır ama sınırlandırılır. Bedeli: diğer oyuncular 100 ms kadar geçmişte görünür; bu da server tarafında lag compensation ihtiyacını doğurur.
Rollback netcode
Özellikle dövüş oyunlarında (GGPO) kullanılır. Oyun deterministik simülasyondur ve sadece input'lar gönderilir.
- Yerel input hemen uygulanır; uzak oyuncunun input'u bilinmiyorsa tahmin edilir (genelde son input tekrar edilir).
- Gerçek input geldiğinde tahmin yanlışsa oyun, o karenin kaydedilmiş durumuna geri sarılır (rollback).
- Doğru input'larla bugüne kadar olan kareler aynı kare içinde yeniden simüle edilir.
Gereksinimler: Tüm oyun durumunun hızlıca kaydedilip yüklenebilmesi, tam determinizm (fixed-point veya dikkatli float kullanımı, deterministik RNG) ve birkaç kareyi tek karede tekrar simüle edebilecek kadar ucuz simülasyon. Ayrıca az miktarda input delay ile rollback mesafesi kısaltılır.
| Interpolation (snapshot) | Rollback | |
|---|---|---|
| Gönderilen | Durum | Input |
| Uygun tür | FPS, MMO, çok oyuncu | Dövüş, az oyunculu, deterministik |
| Bedel | Görüntü gecikmesi | Yeniden simülasyon maliyeti, görsel düzeltmeler |
İlgili Oyun Programlama soruları
- Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?
- Delta time nedir, neden kullanılır?
- Object pooling nedir, neden kullanılır?
- Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?
- Çarpışma tespitinde broad phase ve narrow phase nedir?
- Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.