Masa hokeyi olan hızlı tempolu bir fizik oyunu yapıyorum. İki tokmak ve bir disk ile. Oyun iphone / ipad üzerinde çalışıyor ve GameCenter üzerinden çok oyunculu kısmı yapıyorum.
Ağ sistemi bu şekilde çalışır. Maçı yıldızlandıran müşteri, sunucu olarak kabul edilir ve maç talebini kabul eden müşteri istemcidir.
'Sunucu' fiziği çalıştırıyor ve yanıt anında ve müşteri de fiziği çalışıyor, böylece mesaj alışverişi arasında düzgün görünüyor. Ne sunucu olarak yapmak, istemciye benim puck hızı ve benim konum göndermek ve istemci onun puck hızı / senkronize tutmak için sunucu ile ilgili konumu ayarlar olmasıdır. Aksi takdirde fizik senkronize olmaz ve vidalar.
Ağ gecikmesi iyi olduğunda, 100 ms körük sonuçları oldukça iyidir, istemci tarafında pürüzsüz bir oynanabilir oyun var ve garip davranış minimumdur. Sorun, gecikme yaklaşık 150 ila 200 ms olduğunda ortaya çıkar. Bu durumda, istemcim disk zaten bir kenara ve ters yöne çarptı, ancak sunucudan bir gecikme mesajı alır ve biraz geri top davranışına garip bir duygu neden olur.
Bununla ilgili birkaç şey okudum:
Senkronizasyon Örneği'ni tıklayın
Peki, bunu nasıl çözebilirim? Bildiğim en iyi seçeneği okuduğum kadarıyla zaman damgası ile sunucu / istemcide bir saat senkronizasyonu yapmak, böylece saatimle ilgili gecikme mesajları aldığımda, sadece görmezden gelip istemcilerin simülasyonunu yapmasına izin vermek iş. Buna katılıyor musunuz? Ve güvenilir olmayan veri gönderirken (UDP) gecikmeli mesajlar veya mesajlar bozuk olabilir.
Bu en iyi yaklaşımsa, saat senkronizasyonunu nasıl uygularım? Nasıl yapılacağı ile ilgili adımları okudum ama tam olarak anlamadım.
Diyor ki:
- İstemci geçerli yerel saati bir "zaman isteği" paketine damgalar ve sunucuya gönderir.
- Sunucu tarafından alındığında, sunucu sunucu zamanını damgalar ve geri döner
- İstemci tarafından alındığında, istemci gönderilen zamanı gönderilen süreden çıkarır ve hesaplama gecikmesini ikiye böler. İstemci-sunucu zaman deltasını belirlemek için geçerli zamanı sunucu zamanından çıkarır ve doğru saat deltasını elde etmek için yarı gecikmeyi ekler. (Şimdiye kadar bu algothim SNTP'ye çok benziyor)
- İstemci 1'den 3'e kadar olan adımları beş veya daha fazla kez tekrarlar ve her seferinde birkaç saniye duraklar. Arada başka trafiğe izin verilebilir, ancak en iyi sonuçlar için en aza indirilmelidir. Paket makbuzlarının sonuçları birikir ve en düşük gecikme ile en yüksek gecikme sırasına göre sıralanır. Ortalama gecikme süresi, bu sıralı listeden orta nokta örneği alınarak belirlenir.
- Medyandan yaklaşık 1 standart sapmanın üzerindeki tüm numuneler atılır ve kalan numunelerin ortalaması aritmetik bir ortalama kullanılarak alınır.
Bu örneği takip ederek bu olurdu:
Oyun yüklendi ve müşteri zamanım 0 şimdi gibi yapalım, bu yüzden sunucuya zamanım 0 gönderir.
İletiler sunucuya ulaşmak için 150ms sürer ancak sunucunun saati zaten başlamıştı ve istemciden 1 saniye ileridedir. Sunucu mesajı aldığında zaman: 1.15 olacak ve o zamanı istemciye gönderecek, biz iyi miyiz? Gecikmemizin 150 ms'de sabit olduğunu varsayalım.
Şimdi istemci zamanı 1.15 alır ve gönderilen zamanı gönderilen zamanı çıkarır ve hesaplama gecikmesini ikiye böler. Hangisi: 0.3 - 0 = 0.3 / 2 -> 150ms.
İstemci-sunucu zaman deltasını belirlemek için geçerli zamanı sunucu zamanından çıkarır ve doğru saat deltasını elde etmek için yarı gecikmeyi ekler:
İstemci zamanı: 0.3 Sunucu zamanı 1.15
0.3 - 1.15 = .85 + gecikme (.15) = 1
Bu nasıl senkronize edilir? Neyi kaçırıyorum?
Çok oyunculu ve ağ deneyiminde ilk kez, bu yüzden biraz kafam karıştı.
Teşekkür ederim.