Estou escrevendo um jogo para iOS em rede. Ao enviar pacotes com GKMatchSendDataReliable
(que eu assumi ser UDP com seu próprio código de recepção de pacotes gravados) a 60 pacotes por segundo (16 ms entre pacotes adjacentes), os tempos médios de ping pioram rapidamente: abri 7 correspondências do GameCenter abaixo (uma após a outra ) e simplesmente enviou uma "inundação" de 100 pacotes (a uma taxa de 60 pacotes por segundo). Eu medi o tempo médio de ida e volta, e estes são os resultados:
[ 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
Após os últimos 2 testes, os resultados estão em torno de 1000 ms.
Parece que estou sendo estrangulado, provavelmente pelo meu ISP. Por ser um jogo para iOS, as pessoas usarão conexões residenciais regulares.
Quando alterei a taxa de envio de pacotes para 10 vezes mais lenta (portanto, 1 pacote a cada 160 ms), os testes demoram muito mais, mas os tempos de ida e volta permanecem consistentemente baixos.
[21:31:27]: vi um tempo médio de ida e volta de 55.289109 ms, ele viu 69.032727 ms
Portanto, parece manter baixa latência na conexão (e não ser "punido" pelos ISPs). Tenho que reduzir a taxa de pacotes que envio. Lembre-se de que são pacotes muito pequenos, com no máximo 40 bytes, mas ainda estou sendo acelerado.
Estou procurando orientações sobre quantos pacotes UDP posso enviar por segundo para evitar ser acelerado! Existem diretrizes gerais em algum lugar?
fonte
Respostas:
Nem mesmo jogos de ação baseados em PC em casa ou grandes MMOs executam seus pacotes a 60Hz. Além disso, ter tamanhos de pacotes realmente pequenos não é necessariamente uma grande coisa, cada um desses pequenos pacotes tem uma grande sobrecarga em apenas enviá-los.
Tente fotografar para atualizações de 10 Hz com alguma interpolação do lado do cliente. Presumo que você já esteja interpolando porque sempre haverá atrasos no ping.
Leia os tamanhos de MTU e lance mais informações para cobrir o período mais longo. Um tamanho médio de pacote na camada de transporte será aproximadamente 1400, qualquer coisa acima do tamanho da MTU dividirá sua mensagem e causará ainda mais sobrecarga.
fonte
Primeiro, você precisa ter certeza de quão grande são os dados inteiros. Seu ISP provavelmente se preocupará com os bytes reais enviados, não com a quantidade ou a frequência dos datagramas. Se você estiver enviando datagramas com tamanho máximo (65507 cargas úteis) 60 vezes por segundo, estará enviando cerca de 30 Mb / s a montante. Nem todo mundo tem esse tipo de conexão.
Lembre-se de que o cabeçalho IP tem 20 octetos e o cabeçalho UDP tem 8 octetos. São 28 octetos adicionais que você está enviando para cada datagrama.
Se você não está maximizando sua conexão, há muitos locais onde seus pacotes podem estar atrasados: ou seja, o SO do cliente, seu gateway (provavelmente um roteador sem fio ou modem a cabo), seu ISP, o ISP do outro ponto, o outro ponto do outro gateway, o SO do outro ponto, entre outros.
Caso você ainda não o tenha usado, recomendo usar o Wireshark , que é uma ferramenta extremamente poderosa para diagnosticar problemas de rede. Pense nisso como o equivalente a um depurador, mas para redes.
Existem várias maneiras de diagnosticar o tráfego de rede com o Wireshark:
Use o Wireshark em um PC na mesma rede que o dispositivo móvel, com um hub promíscuo e configurando seu dispositivo de rede como promíscuo
Defina um PC como um gateway sem fio e conecte seu dispositivo móvel a esse gateway e, em seguida, ouça com o Wireshark no referido PC
Execute o Wireshark na mesma máquina que um emulador
Execute o tcpdump no próprio dispositivo (fácil no Android, requer jailbreak no iOS) e leia os dados capturados no Wireshark
Crie um programa simples que faça exatamente a mesma coisa, mas que funcione em um PC, e use o Wireshark lá.
... e muitos outros
Você deseja verificar quais pacotes estão sendo enviados e quando. Por exemplo, se o atraso ocorrer antes de serem enviados, você estará sendo controlado pelo sistema operacional; enquanto que se você estiver recebendo o atraso, mesmo em uma versão desktop do mesmo programa, isso significa que você está sendo prejudicado pela rede em algum lugar.
Geralmente, se você estiver sendo otimizado pela rede, deverá obter datagramas do tipo 4 do ICMP, para poder usá-los para verificar exatamente onde está sendo otimizado.
Em conclusão, há muitas razões pelas quais seus pacotes podem estar atrasando, e seria sensato descobrir onde está o problema antes de começar a tentar resolvê-lo.
fonte
Parece que uma das minhas suposições estava errada. De acordo com isso :
Alterar o modo de envio para UDP real (ou seja
GKMatchSendDataUnreliable
) parece manter baixas taxas de ping a 60 pacotes por segundo. Parece que fui atingido por Nagles mais uma vez .Ainda sinto um comportamento estranho (períodos com tempos de ping muito altos), mas não tenho certeza da causa raiz (ISP ou congestionamento da rede).
Mais tarde:
Então é esporádico e vai em ondas. Acho que vou ter que tentar algumas das sugestões nos outros posts, como reduzir minha taxa de envio de pacotes.
fonte