anasayfa / blog / network
Yayın: 11 Mart 2026 13 dk okuma network
Client prediction'ı anlatmanın en sade yolu

Client prediction'ı anlatmanın en sade yolu

Çok oyunculu hareket sistemleri karmaşık görünür. Aslında üç adımdan ibarettir: tahmin et, karşılaştır, düzelt.

Neden gerekiyor

Sunucu otoritesi olmadan hile engellenemez. Ama her girdiyi sunucuya yollayıp cevabı beklerseniz, oyuncu tuşa bastıktan 80 ms sonra hareket eden bir karakter görür. Bu oynanamaz.

Çözüm: istemci hareketi hemen kendi tarafında uygular ve aynı anda girdiyi sunucuya yollar. Yani geleceği tahmin eder.

Üç adım

Tahmin: İstemci girdiyi anında simüle eder ve sonucu tick numarasıyla birlikte bir geçmiş tamponuna yazar.

Karşılaştırma: Sunucu kendi hesabını yolladığında istemci, o tick için sakladığı kendi sonucuyla karşılaştırır.

Düzeltme: Fark tolerans içindeyse hiçbir şey yapılmaz. Değilse pozisyon sunucununkiyle değiştirilir ve o tick'ten bu yana gelen tüm girdiler yeniden oynatılır.

Pratikteki tuzaklar

Simülasyonun deterministik olması şart. Aynı girdi, aynı başlangıç durumu, aynı sonucu vermeli. Time.deltaTime kullanan bir fizik adımı bunu bozar — sabit tick süresi kullanın.

Düzeltmeyi ani yapmayın. Küçük farkları birkaç frame'e yayarak yumuşatmak, oyuncunun ışınlandığını hissetmesini engeller.

Reconciliation.cs
void OnServerState(ServerState s) { _history.DiscardBefore(s.Tick); if (Vector3.Distance(s.Position, _history[s.Tick].Position) < TOLERANCE) return; // tahmin dogru, dokunma transform.position = s.Position; // duzelt for (int t = s.Tick + 1; t <= _localTick; t++) Simulate(_history[t].Input); // ve yeniden oyna }
csharpReconciliation.cs

Nereden başlamalı

Önce tek oyunculu hareketi sabit tick üzerine kurun ve deterministik hale getirin. Ağ katmanını sonra ekleyin.

Bu sırayı ters çevirenler, hem hareket hem senkronizasyon hatalarını aynı anda ayıklamak zorunda kalıyor. Tecrübeyle sabittir.

← Tüm yazılar