Desculpe o comprimento, é meio necessário.
Introdução
Estou desenvolvendo um software de desktop remoto (apenas por diversão) em C # 4.0 para Windows Vista / 7. Passei por obstáculos básicos: tenho um sistema de mensagens UDP robusto, design de programa relativamente limpo, tenho um driver de espelho (o driver de espelho DFMirage gratuito do DemoForge) em funcionamento e implementei o NAT para todos Tipos de NAT, exceto NATs simétricos (presentes em situações de firewall corporativo).
Com relação à transferência / compartilhamento de tela, graças ao driver de espelho, sou automaticamente notificado das regiões alteradas da tela e posso simplesmente organizar o bitmap de tela em constante mudança do driver de espelho no meu próprio bitmap. Em seguida, comprimo a região da tela como PNG e a envio do servidor para o meu cliente. As coisas parecem muito boas, mas não são rápidas o suficiente. É tão lento quanto o VNC (btw, eu não uso o protocolo VNC, apenas um protocolo amador personalizado).
Do software de desktop remoto mais lento ao mais rápido, a lista geralmente começa em todas as implementações semelhantes a VNC, depois sobe para o Microsoft Windows Remote Desktop ... e depois ... TeamViewer. Não tenho muita certeza sobre o CrossLoop, o LogMeIn - eu não os usei, mas o TeamViewer é incrivelmente rápido. É literalmente ao vivo. Eu executei um tree
comando no prompt de comando e ele foi atualizado com um atraso de 20 ms. Posso navegar na Web apenas alguns milissegundos mais lento que no meu laptop. Rolar o código verticalmente no Visual Studio tem um atraso de 50 ms. Pense em quão robusta a solução de transferência de tela do TeamViewer deve ser para conseguir tudo isso.
Os VNCs usam ganchos baseados em pesquisas para detectar alterações na tela e captura de tela de força bruta / comparação na pior das hipóteses. Na melhor das hipóteses, eles usam um driver de espelho como o DFMirage. Eu estou neste nível. E eles usam algo chamado protocolo RFB.
A Área de Trabalho Remota do Microsoft Windows aparentemente vai um passo acima do VNC. Ouvi, de algum lugar no StackOverflow, que a Área de Trabalho Remota do Windows não envia bitmaps de tela, mas comandos de desenho reais. Isso é bastante brilhante, porque ele pode enviar texto simples (desenhe esse retângulo nessa coordenada e pinte-o com este gradiente)! A Área de Trabalho Remota é realmente muito rápida - e é a maneira padrão de trabalhar em casa. E usa algo chamado protocolo RDP.
Agora, o TeamViewer é um completo mistério para mim. Aparentemente, eles lançaram o código fonte da versão 2 (o TeamViewer é a versão 7 em fevereiro de 2012). As pessoas leram e disseram que a versão 2 é inútil - são apenas algumas melhorias em relação ao VNC com passagem automática de NAT.
Mas a versão 7 ... é ridiculamente rápida agora. Quero dizer, é realmente mais rápido que o Windows Remote Desktop. Transmitei jogos do DirectX 3D com o TeamViewer (a 1 qps, mas a Área de Trabalho Remota do Windows nem sequer permite a execução do DirectX).
A propósito, o TeamViewer faz tudo isso sem um driver de espelho. Existe uma opção para instalar um, e fica um pouco mais rápido.
A questão
Minha pergunta é: como o TeamViewer é tão rápido?Não deve ser possível. Se você tiver uma resolução de 1920 x 1080 em profundidade de até 24 bits (a profundidade de 16 bits seria notavelmente feia), isso ainda é 6.220.800 bytes brutos. Mesmo usando o libjpeg-turbo (uma das bibliotecas de compactação JPG mais rápidas usadas por grandes empresas), compactando-o para 30 KB (sejamos extremamente generosos), levaria um tempo para rotear pelos servidores do TeamViewer (o TeamViewer ignora os NAT simétricos corporativos, simplesmente proxyizando o tráfego através de seus servidores). E essa compactação libjpeg-turbo levaria tempo para compactar. A compactação JPG de alta qualidade leva 175 milissegundos para uma captura de tela completa de 1920 x 1080 para mim. E esse número aumenta se o computador do host executar um processador Atom. Simplesmente não entendo como o TeamViewer otimizou sua transferência de tela tão bem. Novamente, imagens de tamanho pequeno podem ser altamente compactadas, mas leve pelo menos dezenas de milissegundos para compactar. Imagens de tamanho grande não demoram a compactar, mas demoram muito tempo para serem concluídas. De alguma forma, o TeamViewer conclui todo esse processo para obter cerca de 20 a 25 quadros por segundo. Usei um monitor de rede e o TeamViewer ainda está sem lag a velocidades de 500 Kbps e 1 Mbps (atraso do software VNC por alguns segundos nessa taxa de transferência). Durante meutree
No prompt do prompt de comando, o TeamViewer estava recebendo dados de entrada a uma taxa de 1 Mbps e ainda executando 5-6 fps. O VNC e a área de trabalho remota não fazem isso. Então como?
As respostas serão um pouco complicadas e intricadas, portanto , não publique seus US $ 0,02 se você só diz que é porque eles usam UDP em vez de TCP (você acreditaria que eles realmente usam TCP com o mesmo êxito).
Espero que haja um desenvolvedor do TeamViewer em algum lugar aqui no StackOverflow.
Respostas potenciais
Isso será atualizado assim que as pessoas responderem.
- Meu pensamento é, antes de tudo, que o TeamViewer tenha um controle de rede muito bom. Por exemplo, eles dividem pacotes grandes até um pouco abaixo do tamanho da MTU e nunca perdem uma viagem. Eles provavelmente têm todos os tipos de ganchos sofisticados para detectar alterações na tela, além de comparações de imagem XOR extremamente rápidas.