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.

  1. Yerel input hemen uygulanır; uzak oyuncunun input'u bilinmiyorsa tahmin edilir (genelde son input tekrar edilir).
  2. Gerçek input geldiğinde tahmin yanlışsa oyun, o karenin kaydedilmiş durumuna geri sarılır (rollback).
  3. 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önderilenDurumInput
Uygun türFPS, MMO, çok oyuncuDövüş, az oyunculu, deterministik
BedelGörüntü gecikmesiYeniden simülasyon maliyeti, görsel düzeltmeler
  1. Oyun döngüsü (game loop) nedir? Sabit ve değişken zaman adımı arasındaki fark nedir?OrtaOyun ProgramlamaGame Dev
  2. Delta time nedir, neden kullanılır?KolayOyun ProgramlamaGame Dev
  3. Object pooling nedir, neden kullanılır?OrtaOyun ProgramlamaGame Dev
  4. Entity Component System (ECS) nedir? Klasik nesne yönelimli yapıdan farkı nedir?ZorOyun ProgramlamaGame Dev
  5. Çarpışma tespitinde broad phase ve narrow phase nedir?ZorOyun ProgramlamaGame Dev
  6. Multiplayer oyunlarda server authority, client-side prediction ve lag compensation nasıl çalışır?ZorOyun ProgramlamaGame Dev

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle