Kısıltılmaması nasıl önlenir?


9

Ağa bağlı bir iOS oyunu yazıyorum. İle paketleri gönderirken GKMatchSendDataReliable(hangi farz 60 paket saniyede (bitişik paketleri arasına böylece 16 ms), ortalama ping zamanlarda UDP yazılı kendi paket alımı koduyla oldu) hızla kötüleşir: Ben birbiri ardına (aşağıda 7 Gamecenter maçları açıldı ) ve 100 paketlik bir "sel" gönderdi (saniyede 60 paket hızında). Ortalama gidiş-dönüş süresini ölçtüm ve bunlar sonuçlar:

[ 21:16:39 ]:  I saw an average roundtrip time of 52.342787 ms, he saw 54.496590 ms
[ 21:16:34 ]:  I saw an average roundtrip time of 62.631942 ms, he saw 61.991655 ms
[ 21:16:45 ]:  I saw an average roundtrip time of 88.394380 ms, he saw 83.619123 ms
[ 21:16:51 ]:  I saw an average roundtrip time of 179.053118 ms, he saw 156.869141 ms
[ 21:16:57 ]:  I saw an average roundtrip time of 75.025076 ms, he saw 75.419723 ms
[ 21:17:23 ]:  I saw an average roundtrip time of 8832.082488 ms, he saw 7616.877558 ms
[ 21:19:33 ]:  I saw an average roundtrip time of 25088.962344 ms, he saw 16833.064914 ms

Son 2 testten sonra sonuçlar yaklaşık 1000 ms'dir.

Büyük olasılıkla ISS'm tarafından kısılmışım gibi görünüyor. Bu bir iOS oyunu olduğu için insanlar düzenli konut bağlantıları kullanacaklar.

Paket gönderme hızını 10 kat daha yavaş (yani her 160 ms'de bir paket) olarak değiştirdiğimde, testler çok daha uzun sürüyor, ancak gidiş-dönüş süreleri sürekli olarak düşük kalıyor.

[21:31:27]: Ortalama bir gidiş dönüş süresi 55.289109 ms gördü, 69.032727 ms gördü

Bu yüzden bağlantıda düşük gecikme süresi tutmak gibi görünüyor (ve ISS'ler tarafından "cezalandırılmıyor") Gönderdiğim paketlerin oranını azaltmak zorundayım. Bunların maksimum 40 bayt gibi çok küçük paketler olduğunu unutmayın , ancak hala kısıtlıyım.

Kısılmaktan kaçınmak için saniyede kaç UDP paketi gönderebileceğim konusunda yönergeler arıyorum! Herhangi bir yerde genel yönergeler var mı?


Test yaptın mı? 10 pakete / saniyeye düşerseniz ne olur? O zaman ciddi bir şekilde kısılır mısın? Bu, sorunuzun son kısmını yanıtlamanıza yardımcı olabilir.
notlesh

"Seni nasıl boğduğuna göre bir adam hakkında çok şey söyleyebilirsin ..." Oh, bu 'gaz kelebeği' tanımını kastetmiştin: P
Casey

UDP üzerine inşa ettiğiniz güvenilir sistemlerle bağlantınızı doyurmayacağınızdan emin olun. UDP düşmeye başladığında, geçici kurtarma sistemlerinin doğru yapılması biraz zor oluyor. Asla kötülüğe atfedilen şey ...
Lars Viklund

Görünüşe göre bir hata yapmış olabilirim. Yine NAGLES olabilir.
bobobobo

Yanıtlar:


9

Evde PC tabanlı aksiyon oyunları veya büyük MMO'lar bile paketlerini 60Hz'de çalıştırmaz. Artı gerçekten küçük paket boyutlarına sahip olmak her zaman harika bir şey değildir, bu küçük paketlerin her birinin sadece göndermede büyük bir yükü vardır.

İstemci tarafı enterpolasyonu ile 10Hz güncellemeleri için çekim yapmayı deneyin. Zaten enterpolasyon yaptığınızı varsayıyorum çünkü her zaman ping gecikmeleri olacak.

MTU boyutlarını okuyun ve daha uzun zaman aralığını kapsamak için daha fazla bilgi girin. Taşıma katmanındaki ortalama paket boyutu 1400 veya daha fazla olacaktır, MTU boyutu üzerindeki herhangi bir şey mesajınızı böler ve daha fazla ek yüke neden olur.


7

İlk olarak, tüm verilerin ne kadar büyük olduğundan emin olmalısınız. İSS'niz büyük olasılıkla datagramların miktarını veya sıklığını değil, gönderilen gerçek baytları dikkate alacaktır. Saniyede 60 kez maksimum (65507 taşıma yükü sekizli) boyutunda datagram gönderiyorsanız, yukarı yönde yaklaşık 30 Mb / s gönderiyorsunuz. Herkesin böyle bir bağlantısı yoktur.

IP başlığının 20 oktet uzunluğunda ve UDP başlığının 8 oktet uzunluğunda olduğunu unutmayın. Bu, her datagram için 28 ek oktet gönderir.

Bağlantınızı maksimize etmiyorsanız, paketlerinizin gecikebileceği birçok yer vardır: müşterinin işletim sistemi, ağ geçidiniz (muhtemelen bir kablosuz yönlendirici veya kablo modem), İSS'niz, diğer eşinizin İSS'si, diğer eşin ağ geçidi, diğerleri arasında diğer eşin işletim sistemi.

Henüz kullanmadıysanız , ağ sorunlarını teşhis etmek için son derece güçlü bir araç olan Wireshark'ı kullanmanızı öneririz . Bunu bir hata ayıklayıcının eşdeğeri olarak düşünün, ancak ağ için.

Wireshark ile ağ trafiğini teşhis etmenin birkaç yolu vardır:

  • Wireshark'ı mobil cihazla aynı ağdaki bir bilgisayarda, karışık bir hub ile kullanın ve ağ cihazınızı karışık olarak ayarlayın

  • PC'yi kablosuz ağ geçidi olarak ayarlayın ve mobil cihazınızı bu ağ geçidine bağlayın, ardından söz konusu PC'de Wireshark ile dinleyin

  • Wireshark'ı bir emülatörle aynı makinede çalıştırın

  • Cihazda tcpdump'ı çalıştırın (Android'de kolay, iOS'ta jailbreak gerektirir) ve ardından Wireshark'ta yakalanan verileri okuyun

  • Aynı şeyi yapan basit bir program yapın, ancak bu bir bilgisayarda çalışır ve orada Wireshark kullanın.

  • ... Ve bircok digerleri

Hangi paketlerin ne zaman gönderildiğini kontrol etmek istiyorsunuz. Örneğin, gecikme gönderilmeden önce gerçekleşirse, işletim sistemi tarafından kısıtlanırsınız; aynı programın masaüstü sürümünde bile gecikme yaşıyorsanız, bu, ağ tarafından bir yerde kısıtlandığınız anlamına gelir.

Genellikle, ağ tarafından kısıtlanırsanız, ICMP tip 4 datagramları almanız gerekir, böylece bunları tam olarak nerede kısıldığınızı kontrol etmek için kullanabilirsiniz.

Sonuç olarak, paketlerinizin gecikmesinin birçok nedeni olabilir ve sorunu çözmeye başlamadan önce sorunun nerede olduğunu bulmak akıllıca olacaktır.


0

Varsayımlarımdan birinin yanlış olduğu anlaşılıyor. Göre bu :

GKMatchSendDataUnreliable modu, UDP olarak adlandırılan görüntüde iletilecek görüntü. GKMatchSendDataGüvenilir mod görüntüsü TCP ile gönderilir. Genellikle bir GKMatchSendDataUnreliable olması gerekir.

Gönderme modunun gerçek UDP (yani GKMatchSendDataUnreliable) olarak değiştirilmesi, saniyede 60 pakette düşük ping hızlarını koruyor gibi görünüyor . Ben Nagles çarptı anlaşılıyor yine .

Hala tuhaf davranışlar (çok yüksek ping süreleri olan dönemler) alıyorum, ancak kök nedeninden (ISS veya ağ tıkanıklığı) emin değilim.

[ 10:30:33 ]:  I saw an average roundtrip time of 39.908923 ms, he saw 48.437794 ms
[ 10:30:39 ]:  I saw an average roundtrip time of 26.278577 ms, he saw 27.023854 ms
[ 10:30:48 ]:  I saw an average roundtrip time of 23.254163 ms, he saw 24.495182 ms
[ 10:30:54 ]:  I saw an average roundtrip time of 37.333127 ms, he saw 34.780404 ms
[ 10:31:03 ]:  I saw an average roundtrip time of 29.198575 ms, he saw 29.071106 ms
[ 10:31:11 ]:  I saw an average roundtrip time of 49.030299 ms, he saw 48.675459 ms
[ 10:31:18 ]:  I saw an average roundtrip time of 34.031792 ms, he saw 34.698117 ms
[ 10:31:24 ]:  I saw an average roundtrip time of 30.058642 ms, he saw 32.814952 ms
[ 10:31:30 ]:  I saw an average roundtrip time of 53.110438 ms, he saw 54.271453 ms
[ 10:31:45 ]:  I saw an average roundtrip time of 119.693933 ms, he saw 107.616359 ms
[ 10:31:50 ]:  I saw an average roundtrip time of 222.644443 ms, he saw 229.589861 ms
[ 10:31:57 ]:  I saw an average roundtrip time of 166.827070 ms, he saw 167.647724 ms
[ 10:32:05 ]:  I saw an average roundtrip time of 765.356593 ms, he saw 859.600923 ms
[ 10:32:13 ]:  I saw an average roundtrip time of 357.522686 ms, he saw 339.648654 ms
[ 10:32:24 ]:  I saw an average roundtrip time of 1115.639593 ms, he saw 1060.574401 ms
[ 10:32:39 ]:  I saw an average roundtrip time of 175.845995 ms, he saw 171.112166 ms
[ 10:32:44 ]:  I saw an average roundtrip time of 47.262925 ms, he saw 41.987869 ms
[ 10:32:52 ]:  I saw an average roundtrip time of 74.524443 ms, he saw 78.868198 ms
[ 10:33:47 ]:  I saw an average roundtrip time of 20.943917 ms, he saw 21.217377 ms
[ 10:33:52 ]:  I saw an average roundtrip time of 28.944821 ms, he saw 29.303144 ms
[ 10:34:06 ]:  I saw an average roundtrip time of 25.581624 ms, he saw 25.439416 ms
[ 10:34:13 ]:  I saw an average roundtrip time of 25.565568 ms, he saw 25.655267 ms
[ 10:34:18 ]:  I saw an average roundtrip time of 38.609394 ms, he saw 37.462835 ms

Sonra:

[ 10:38:11 ]:  I saw an average roundtrip time of 40.037623 ms, he saw 43.367524 ms
[ 10:38:21 ]:  I saw an average roundtrip time of 121.222703 ms, he saw 118.855264 ms
[ 10:38:28 ]:  I saw an average roundtrip time of 726.391897 ms, he saw 685.742454 ms
[ 10:38:33 ]:  I saw an average roundtrip time of 60.251207 ms, he saw 57.974503 ms
[ 10:38:42 ]:  I saw an average roundtrip time of 1133.909392 ms, he saw 1124.404501 ms     

Yani dağınık ve dalgalar halinde gidiyor. Sanırım paket gönderme hızımı azaltmak gibi diğer yazılarda bazı önerileri denemek zorunda kalacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.