Idioma: C ++
Minha pergunta é a seguinte: Gostaria de saber qual seria a melhor ou pelo menos uma boa maneira de compactar e enviar dados do cliente para o servidor e o inverso. Haverá alguns dados compondo um único pacote. Um pacote terá um "id", que define para que serve, então os dados em uma ordem predeterminada para a "ação" à qual o pacote corresponde.
Para sistemas menos dependentes de desempenho, eu apenas enviava seqüências de caracteres, que seriam separadas por um espaço, sendo eles os dados da "ação" e a primeira "palavra" do identificador de pacotes e apenas encadeava as instruções if verificando quando há uma correspondência .
Agora, para um sistema mais crítico, o que eu pensei até agora foi algo como isto:
Faça uma string com a identificação do pacote e os dados e envie-os. Em seguida, para descompactar, eu poderia extrair o primeiro número inteiro na string e ter uma matriz de manipuladores de pacotes, com índices correspondentes ao ID do pacote que eles manipulam, e fazer algo como packetHandlers [packetID] .Process (packetData).
O que você acha disso, alguma sugestão? muito apreciado!
fonte
Por que usar dois esquemas de codificação diferentes? Basta usar o segundo para cada sistema. Apenas mantenha as coisas simples.
Considere usar a compactação delta. Ou seja, envie um valor total e depois disso apenas as coisas que mudaram. Após algumas iterações do jogo, envie um valor total novamente.
Outra codificação que você pode considerar é a Base 128 Varint. O Google Protobufs o usa. Dê uma olhada na página "Codificação" do guia do desenvolvedor: Codificação de buffers de protocolo Pode economizar alguns bytes.
fonte
O que pode ser um exemplo dos dados que você está enviando? Não vejo motivo para fazer algo excessivamente chique. Depois que os dados estiverem totalmente carregados no buffer do receptor, inspecione o primeiro com
int
base em seu valor, e você saberá como processar o restante dos dados.Assim, um pacote que tem quatro partes de dados
id
,val1
,val2
, eval2
pode ter esta aparência:Ao ler o primeiro byte (que você sabe que sempre estará lá), você decide como processar o próximo conjunto de dados. Se a primeira palavra (id) é que
00000001
você sabe que existem mais três dwords a seguir, e esse é o fim do pacote. Para continuar o exemplo, você pode ter id =00000010
e sua especificação diz que para o valor id 2, você processafloat
,float
,float
nessa ordem, o que pode especificar uma posição do jogador no espaço do mundo.Pense nisso ao escrever seu próprio sistema de arquivos binários, você tem um valor de cabeçalho, que descreve o restante dos dados, onde eles estão localizados (em que posição) e que tipo de dados devem ser tratados.
fonte