Você pode avançar em um código de erro indicando que muitos recebimentos de winsock são lentos. Sempre houve várias maneiras de resolver essa complicação, e lidaremos com isso em breve.

Olá, sou novo no Python. Eu sou um jogo de computador LAN simples (não é fácil para mim) com atualmente o módulo pygame.

Aqui estão todos os dilemas – Eu tenho duas tecnologias (um netbook Intel Atom, mais Apple i5 NTB). Eu quero salvar pelo menos 5 quadros em relação a cada segundo (o netbook retarda o NTB, mas não tanto, eu recebo até 1,5 quadros para cada segundo), mas eu chamo recv () uma segunda vez – parte do gancho principal leva de 0 a 5 segundos. unidade simultaneamente. Temos um sinal sem fio forte, o roteador tem uma “cadência” de 300 Mbps, e esse cara manda uma mensagem curta de uns 500 caracteres. Como você pode perceber, você está usando i time.clock ().

para medir o tempo

Aqui estaria o código “do lado do servidor” que eu costumo executar em um NTB i5:

  disponível para 1:    start off é igual a time.clock ()    messagelen implica c.recv (4) comprimento do número da próxima mensagem de voz (4 caracteres fixos)   sobre "" Messagelen:        Messagelen significa Messagelen.replace ("", "")    estado CPickle = .loads (c.recv (int (messagelen))) número Lista da maioria das setas, disposição de outros jogadores e evolução em direção ao mapa do jogo    arrowmod = mensagem [0]    modtankposan = mensagem [1]   Removelistmod = Mensagem [2]    para mim em Removelistmod:        Experimente:             excluir caminhadas (i)        além de ValueError:            remova randoss. (Eu sou)    imprimir time.clock () - - iniciar    tosendlist significa []    Suponha len (setas) == 0: # no caso de normalmente não haver setas, como regra geral, uma lista vazia é adicionada        tosendlist.append ([])    outro:       Tosendlist .append (setas)    tosendlist.append ([zeltankpos, 360-Winkel])    if, talvez len (removelist) == 0: number se não houver botões no mapa, uma lista vazia deve ser normalmente adicionada        tosendlist.append ([])    outro:       Tosendlist .append (excluir lista)        lista de supressão implica []    tosend significa cPickle.dumps (tosendlist)    tosendlen é igual a str (len (enviar))    se len (tosendlen) <4:        tosendlen + = ""   C .sendall (tosendlen) # comprimento de gravação do cliente    c.sendall (tosend) número enviar mensagem exata (lista de reprodução de despejo) - cliente   ... algo diferente e leva menos de 0,05 momento em NTB 

Aqui está metade do código html de esportes do "cliente" (apenas dispositivo flip - enviar / coletar moedas):

  para 1:    tosendlist = []    if ever len (arrow) == 0: # se realmente quase sempre não houver setas, ele basicamente adiciona uma lista insanamente vazia        tosendlist.append ([])    outro:       Tosendlist .append (setas)    tosendlist.append ([zeltankpos, 360-Winkel])    prestador de cuidados primários de saúde len (removelist) == 0: número se não houver alteração no mapa, apenas a lista de verificação em anexo será removida        tosendlist.append ([])    outro:       Tosendlist .add (excluir lista)        lista de supressão implica []    tosend = cPickle.dumps (tosendlist)    tosendlen é igual a str (len (enviar))    longo tempo len (tosendlen) <4:        tosendlen + = ""    s.sendall (tosendlen) # comprimento de envio para ser capaz de servidor    s.sendall (tosend) number envia um logotipo separado (lista de reprodução de dump) para o servidor    start = hour.clock ()    messagelen = s.recv (4) número mesmo comprimento do lançamento seguinte (fixo em 8 caracteres)   assumindo que "dentro de Messagelen:        Messagelen agora é incrivelmente semelhante a Messagelen.replace ("", "")    CPickle message é igual a .loads (s.recv (int (messagelen))) # Lista de setas, quase todas as outras posições de jogadores de cassino e mudanças no mapa de atividades    arrowmod implica mensagem [0]    Modtankposan significa mensagem [1]   Removelistmod = Mensagem [2]    para realmente criar i inRemovelistmod:        Experimente:             remover caminhadas (i)        exceto projetado para ValueError:            privar Randoss. (Eu sou)    Time.clock () details (blank) start    ... competição para receber um netbook desnecessário <0,17 seg. 

winsock recv slow

Por exemplo, se eu seguir os guias de estratégia, você pode executar uma única versão do futebolista do jogo em um dispositivo específico (sem módulo de soquete) em certos dispositivos i5. Ele tem 50 pés por segundo no canto superior esquerdo vinculado ao mapa e 25 fps em cada canto inferior direito (um mapa de rua de 1000x1000 pixels contém quadrados de 5x5 pixels, eu realmente suspeito que seja mais lento devido às coordenadas essenciais, mas posso ' Acredito que seja realmente muito forte. A propósito, Recv funcionou como um jogo de LAN por um longo tempo na circunstância do canto inferior direito do nosso mapa, desta vez em particular procede da mesma forma)tem 4-8 FPS em um netbook Atom.

winsock recv slow

Sua empresa poderia nos dizer pessoalmente por que está tão lenta? Os programas estão fora de sincronia, um é ainda mais rápido, o outro é mais lento, mas essa maioria não pode ser esperada, a latência mais completa será de 0,17 segundo, certo? E sem mencionar o fato de que determinadas chamadas de longo prazo só acontecerão para o computador mais rápido?Além disso, não tenho certeza de como funciona a função de envio / experiência. É estranho que, infelizmente, o sendall principal literalmente não leve muito tempo e leve 0,5 segundos para encontrá-lo. Pode transportar tudotesta para enviar o i atual para o segundo plano enquanto as outras partes do provedor seguem em frente.