Henüz yapmadıysanız, bu iki derin ancak anlaşılır makaleyi okumanızı öneririm: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking ve http://fabiensanglard.net/quake3/network.php .
Bunlar, neden 'sabit aralıklı' paket gönderimi kullanmanın önerildiğini açıklamaktadır. Kısacası, aslında sunucu tarafından gönderilen paketler için önemlidir.
Bir paket göndermenin sabit bir maliyeti vardır ve bir ağ paketinin maksimum boyutu yaklaşık 1,5 KB'dir. Eğer sunucunuzda örneğin 16 oyuncu varsa, bir oyuncu için hareketi hesapladığınızda her kare, naif kod her hareket çözünürlüğünden sonra her oyuncuya bir güncelleme paketi gönderebilir, yani 16 * 16 = 256 paket. 30'luk bir kare hızınız varsa, bu 7680 pakettir.
Daha iyi bir yaklaşım, çerçevenin her başlangıcında bir tampon oluşturmak, içinde hesaplanmış 16 konum güncellemenizi birleştirmek ve sonra bunları 16 oynatıcınıza göndermek.
Şimdi aynı sonuçları elde etmek için saniyede yalnızca 480 paket gönderiyorsunuz.
Oyuncudan sunucuya durumda, bu aynı pakette, örneğin; pozisyon baktı, eylemler bu çerçeveye çağırdı ve böyle devam etti.
Sorunuzun ikinci kısmı hakkında - gecikme hissini azaltmayı tercih etme yöntemim, bu bilgiyi her karedeki sunucuya göndermek oldu:
oyuncunun gerçek geçerli konumu (sunucu tarafı ve oyuncu tarafı konumlarının fazla senkronize edilip edilmediğini kontrol etmek için sunucu tarafından kullanılır).
1 saniyede tahmini oyuncu pozisyonu: müşteri tarafından hesaplanır: oyuncu fare yönünü değiştirmezse ve klavyeyi geçerli durumda 1 saniye bırakırsa oyuncu nerede olur? (Çarpışmaları umursamıyoruz) Eğer oyuncu hareket etmiyorsa, 1 saniye içinde tahmin edilen pozisyonu mevcut pozisyonudur.
Baktığı pozisyon.
Sunucu bu bilgiyi her aldığında, gelecekteki pozisyonu ve bakılan pozisyonu günceller ve oyuncu varlığı eninde sonunda pozisyonuna geçer.
Oyuncular hiçbir zaman tam olarak senkronize edilmez, ancak giriş yanıtı anındadır (benim için en önemli olan) ve tahmin edilen konumların benim için yeterince doğru olduğunu tespit ettim.