aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Oyun Sunucusu

Oyun Latency Düşürme: Lokasyon, Route ve Kod

Oyun latency'si, oyuncunun ekranında hissedilen gecikmenin büyük kısmını belirler ve çoğu zaman tek bir sebebe değil, üst üste binen birkaç gecikme katmanına dayanır. Ping'i düşürmek için işi üç başlıkta düşünmek pratik bir yol sunar: oyuncuya fiziksel olarak yakın bir lokasyon seçmek, paketin geçtiği ağ rotasını iyileştirmek ve sunucunun kendi kodunda tick döngüsü ile paket akışını düzenlemek. Bu yazıda üçünü de gerçek, uygulanabilir adımlarla ele alıyorum.

Latency nereden gelir?

Bir oyuncunun gördüğü gecikme aslında birkaç parçanın toplamıdır:

  • Propagasyon gecikmesi: Sinyalin fiber üzerinde kat ettiği mesafe. Işık camda yaklaşık 200.000 km/s hızla ilerler; bu yüzden 3.000 km mesafe tek yön için bile ~15 ms taban gecikme demektir. Bunu kod ile silemezsiniz, sadece mesafeyi kısaltarak azaltabilirsiniz.
  • Sıraya girme ve işleme gecikmesi: Yol üzerindeki router'larda, sunucunun ağ kartında ve oyun döngüsünde paketin beklediği süre.
  • Serileştirme gecikmesi: Paketi hatta yazmak için geçen süre; düşük bant genişliğinde büyük paketlerde belirginleşir.
  • Tick gecikmesi: Sunucu durumu sabit aralıklarla güncellediği için, gelen girdi bir sonraki tick'e kadar bekleyebilir.

Hedef, kontrol edebildiğiniz her katmanda birkaç milisaniye kazanmak; çünkü bunlar toplanır.

1. Doğru lokasyonu seçmek

En büyük ve en ucuz kazanç genellikle sunucuyu oyuncu kitlesine yaklaştırmaktan gelir. Oyuncularınızın çoğu Türkiye ve Avrupa'daysa, sunucuyu Frankfurt, Amsterdam veya İstanbul gibi merkezi bir bölgede tutmak ABD'deki bir veri merkezine kıyasla onlarca milisaniye tasarruf ettirir. Tek bir doğru karar, sonraki tüm optimizasyonlardan daha çok fark yaratabilir.

Bir lokasyonu kabul etmeden önce gerçekten ölçün. Hedef bölgeden taban gidiş-dönüş süresini görmek için:

ping -c 20 sunucu-ip
mtr -rwzc 50 sunucu-ip

mtr çıktısında her sıçramadaki paket kaybına ve gecikme sıçramalarına bakın; sorunun mesafeden mi yoksa kötü bir ara hattan mı kaynaklandığını ayırt etmenizi sağlar. Oyuncu kitleniz birden çok kıtaya yayılıyorsa, tek dev sunucu yerine bölgesel sunucular açıp oyuncuyu en yakın olana yönlendirmek doğru çözümdür.

2. Ağ rotasını iyileştirmek

İki nokta arasındaki coğrafi mesafe kısa olsa bile, internet trafiği bazen uzun ve kötü bir rota izler. mtr veya traceroute ile gereksiz dolambaçları ya da sık paket kaybı yaşanan bir aktarım sağlayıcısını tespit edebilirsiniz.

  • Sağlayıcı ve peering kalitesi: İyi peering anlaşmaları olan, oyuncularınızın ISP'lerine yakın bağlanan bir barındırma sağlayıcısı seçin. Aynı veri merkezinde bile farklı sağlayıcıların rotaları değişir.
  • UDP kullanın: Gerçek zamanlı oyun trafiği için TCP'nin yeniden iletim ve sıralı teslim garantisi genelde zararlıdır; kaybolan eski bir konum paketini beklemek, yeni paketi geciktirir. Çoğu oyun, kendi güvenilirlik katmanını UDP üzerine kurar.
  • MTU ve fragmentasyon: Paketlerinizi yol MTU'sunun altında tutun (genelde 1500 bayt, tünel varsa daha düşük) ki fragmentasyon ve onun getirdiği ek gecikme oluşmasın.

3. İşletim sistemi ve soket ayarları

Linux tarafında birkaç ayar, sunucunun paketi tutma süresini kısaltır. En önemlisi Nagle algoritmasını kapatmaktır; bu algoritma küçük paketleri biriktirip gönderdiği için interaktif trafikte gözle görülür gecikme ekler:

int flag = 1;
setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &flag, sizeof(flag));

UDP soketlerinde ise gönderim/alım tamponlarını boğulmaya karşı yeterince büyük tutun ve soketi non-blocking modda epoll ile sürün. Yük altında tamponun taşıp paketi düşürmesi, sıçrayan ping'in sık görülen sebebidir. net.core.rmem_max gibi çekirdek parametrelerini gerçek yüke göre ayarlayın; körlemesine değil.

4. Tick rate ve oyun döngüsü

Sunucu dünyayı sabit bir frekansta (tick rate) günceller. 20 Hz bir döngü her 50 ms'de bir adım atar; 60 Hz ise her ~16,7 ms'de. Daha yüksek tick rate, girdinin işlenmesi için beklediği süreyi kısaltır ama CPU maliyetini artırır. Pratikte hızlı tempolu oyunlarda 30–60 Hz arası tercih edilir.

Önemli olan döngünün sabit ve öngörülebilir kalmasıdır. Düzgün bir sabit zaman adımı şuna benzer:

const double dt = 1.0 / 30.0; // 30 Hz
double accumulator = 0.0;
double last = now();
while (running) {
    double current = now();
    accumulator += current - last;
    last = current;
    while (accumulator >= dt) {
        update(dt);     // simülasyonu ilerlet
        accumulator -= dt;
    }
    flush_outgoing();   // durumu hemen gönder
}

Burada en kritik nokta, update sonrası durumu biriktirmeden hemen göndermektir; aksi halde tick kazancını yapay bir kuyrukta geri verirsiniz. Ayrıca tick içindeki ağır işleri (veritabanı yazımı, dosya I/O, log) ana döngüden ayrı bir thread'e taşıyın ki tek bir yavaş sorgu tüm oyuncuları dondurmasın.

5. Bant genişliğini ve jitter'ı yönetmek

Ham ping kadar önemli olan bir diğer şey jitter, yani gecikmenin oynamasıdır. Stabil 60 ms, sürekli 20–120 arası zıplayan bir ping'den daha iyi hissettirir. Jitter'ı azaltmak için:

  • Durum güncellemelerini delta (yalnızca değişeni gönderme) ile küçültün; daha az veri, daha az serileştirme gecikmesi demektir.
  • Oyuncu başına gönderim hızını sabit tutun; ani trafik patlamaları kuyrukları şişirir.
  • İstemci tarafında küçük bir interpolasyon tamponu kullanarak ağ dalgalanmasını yumuşatın.

Sık Sorulan Sorular

Tick rate'i artırmak ping'i düşürür mü?

Doğrudan ağ ping'ini düşürmez; ağ gecikmesi mesafe ve rota ile ilgilidir. Ancak girdinin işlenmek için beklediği süreyi kısalttığı için oyuncunun hissettiği toplam gecikmeyi azaltır. Sabit ve düşük olması, yüksek olmasından daha önemlidir.

UDP mi TCP mi kullanmalıyım?

Gerçek zamanlı konum/girdi trafiği için UDP. Eski bir paketi beklemek yeni paketi geciktireceğinden TCP'nin sıralı teslimi zarar verir. Güvenilirlik gereken yerlerde (örneğin önemli olaylar) kendi hafif onay katmanınızı UDP üzerine kurun.

Oyuncularım farklı kıtalarda, ne yapmalıyım?

Tek sunucuyla herkesi memnun edemezsiniz. Bölgesel sunucular açın ve oyuncuyu ölçülen en düşük ping'e sahip olana yönlendirin; fiziksel mesafeyi kod ile aşmak mümkün değildir.

Sunucunuzun ping'i mi yüksek? Lokasyon, ağ rotası ve oyun döngüsü tarafında gecikme avı yapıp ölçülebilir bir iyileşme çıkarmanıza yardımcı olabilirim. Benimle iletişime geçin ve kurulumunuza birlikte bakalım.

Bu kategorideki tüm yazılar →

Devamı için