multiplayer oyunda senkronizasyon cok hayati rol oynuyor, ben istanbul oyunununa senkronizasyon ekleyene kadar oyunun oyuncuda yarattigi husran hissini gormeliydiniz
hatta Hydrogen gormustu
Yani oyuncular oyunda saga sola kostururken, aslinda her makine ve serverda ayni anda farkli yerlerde olabiliyorlar. ornegin bir oyuncunun digerine ates ettiginde server'in atisin isabetli olup olmadigina karar vermesi icin server ve client arasindaki her paketin time_stamplerle isaretlenmesi gerekiyor.
Ghost'un da dedigi gibi network delaylari degisken olacaktir. Fakat burada soyle bir avantajimiz var. Genelde delaylerdeki degiskenligin daha cok tcpip deki paket resendlerden kaynaklandigi ortaya cikmis. Yani 100 paket gondersek ve delaylerinin histogramini cikarsak dagilimin esit olmadigini goruyoruz. dagilim genelde minimum delayin tamsayi katlarinda spike'lar seklinde oluyor.
Bu yuzden oyuncu oyuna girerken n tane paket gonderip sonuclarin histogramini cikarmak ve bu histogrami analiz edip server ile o client arasindaki delayi hesaplayarak client'in saatini set etmek gerekiyor (saatlerimizi ayarlayalim). Bu islemi zaman zaman tekrarlamak isteyebiliriz. Fakat onemli olan aslinda delayin degismesinden ziyade, saatlerin senkron devam etmesi. Yani mesela oyuncu oyuna ilk girdiginde bu sekilde saatleri senkron edersek ve sonraki 2 saat boyunca network delay ne olursa olsun, iki bilgisayardaki saatlerin ayni anlarda saniyeleri atmasi mumkundur. delayler ne olursa olsun iki bilgisayar da birbirlerine oyun eventlerini timestampli gonderdikten sonra, her iki bilgisayar da paketi delayli bile alsa timestampe bakarak interpolasyon yapabilir. Mesela:
1- 1000: 1. oyuncu x0,y0 noktasindan x1,y1 e kosmaya basladi. diyelim ki 1100'de varacak
2- 1020: server bu paketi aldi. O anda hiz bilgilerini kullanarak 1. oyuncuyu x2,y2 noktasina koydu (arada bir nokta yolun tam beste birinde mesela) ve onu gorebilecek butun oyunculara bunu sinyalledi
3- 1050: 2. oyuncu paketi aldi. icinde 1000 aninda 1. oyuncunun x0,y0 dan x1,y1e kosmaya basladigini okudu. Bu sirada onun bilgisayarainda 1. oyuncu hala x0,y0 da idi. Simdi 2. oyuncunun client'i kendine bir yol secip bir 1. oyuncuyu hareket ettirmeli. 1100 de x1,y1e vardirmali, bunun icin iki kat hizli kosturabilir veya baska non lineer bir yol secebilir.
Courtesy of Istanbul MMORPG