JEITO MAIS R?PIDO DE CAPTURAR A TELA
Tudo beleza com vocês?
Estou desenvolvendo um aplicativo de suporte remoto usando o protocolo RFB para comunicação.
Todavia, estou me questionando se não existe um jeito mais rápido de capturar a tela do que o GDI+... O método Graphics.CopyFromScreen usa internamente a API BitBlt, que é um pouco lenta pro tipo de aplicação que estou desenvolvendo.
Ouvi falar de um driver chamado DFMirage, que é usado no TightVNC... Estou dando uma olhada na documentação ainda...
O DirectX quebraria meu galho também, porém estou criando um VNC Reverso (Single Click)... onde a ideia é deixar um cliente [Ô]magro[Ô], sem muitas dependências.
Alguma ideia?
Grande abraço!
Obrigado pela resposta.
Acabei capturando a imagem com o CopyFromScreen ... o fato de ser nativo pesou muito nessa decisão.
Consegui [Ô]dar uma recuperada[Ô] tratando a imagem antes de ser enviada. Fazendo a manipulação da imagem por memória não gerenciada deixou beeem mais rápido.
Estou fazendo alguns testes, mas parece que irá ficar [Ô]aceitável[Ô], pelo menos.
Abraços!
Ficou bem legal, o CopyFromScreen quebrou o galho. Depois dividi a imagem em blocos e fui verificando se houve atualização pela memória não gerenciada.
Criei um protocolo com algumas particularidas do RFB para suportar transferência de arquivos simultâneas com o acesso remoto.
No fim, o gargalo acabou sendo mesmo a internet do cliente. Para internets ruins, eu coloquei a opção do suporte escolher a qualidade da imagem inferior.
Caso a internet caia, também busca conexão automaticamente.
Liberei pro pessoal do suporte, conforme as reclamações vierem, vou fazendo as modificações hahaha
Estou realmente orgulhoso do resultado, ficou bem legal. Vou ver se segunda tiro um tempo pra fazer um videozinho do programa funcionando pra vocês verem.
Abração!
No meu caso, talvez tenha sido até melhor usar o BitBlt. Uma taxa de frame muito alta, pegaria em detalhes aquela transição entre janelas (onde a janela fica até meio transparente) e enviaria pacote de bytes desnecessários, sendo que logo, logo haveria uma outra requisição para o estado final. Acabei vendo que a grande vilã era a internet mesmo.
Você tá cheio de planos ehein cara. Ficar bombadão, gameplays, casa auto-sustentável. Você dorme?! hahahaha
Citação::
Não muito, coisa de umas 5 horas por dia. Dedico pelo menos 1 hora por dia para estudar e me iterar nas novidades de TI. Uma ou duas horas para musculação e aeróbicos, geralmente esteira, já estou fazendo um mÃnimo de 9km por dia correndo. Construà um pequeno aerogerador que barateou minha conta de luz em quase 80 reais. Produzo praticamente todos os vegetais que usamos, incluindo batatas, tomates e cebolas, totalmente orgânicos. Assim que eu conseguir toda a grana(e os canais do youtube podem ajudar nisso) compro uma terra meio retirada e viverei nela. O mais offgrid que puder. Já noto os benefÃcios pra minha saúde fÃsica e mental. Me sinto muito mais disposto em todos os sentidos, até com a patroa, entende? A pergunta que me fazem é: porque viver offgrid? Isso levaria um bom tempo para explicar, mas ao final dela, se você entender tudo, vai querer fazer o mesmo que eu.
Top!!! kkkk
O programinha VNC já está rodando, com alguns problemas, mas está.
Acabei usando GDI++ mesmo.
Eu havia tentado diretamente pela BitBlt, porque usando o .NET, na hora do printscreen as telas com transparência não funcionam. Passando alguns flags para o BitBlt você conseguia pegar essa transparência. Porém, tive alguns problemas indesejados, do tipo: Aumentou ainda mais o consumo de CPU, do tipo que reiniciava a máquina depois de um tempo rodando e as vezes simplesmente capturava uma tela toda preta.
Voltei pelo GDI+.
Como me colocaram em outros 34435435345435 projetos, acabei deixando esse um pouco de lado, mas minha intenção é depois melhorar ele.
Acredito que o que esteja gastando muito do CPU seja meu método de comparação de Bitmaps (para saber se a região precisa ser atualizada ou não)
No caso, eu separo a tela em blocos de bitmap e uso esse método para comparar:
private static bool BitmapsIguais(Bitmap bitmap1, Bitmap bitmap2)
{
Rectangle rect = new Rectangle(new Point(0, 0), bitmap1.Size);
BitmapData data1 = bitmap1.LockBits(rect, ImageLockMode.ReadOnly, bitmap1.PixelFormat);
BitmapData data2 = bitmap2.LockBits(rect, ImageLockMode.ReadOnly, bitmap2.PixelFormat);
try
{
IntPtr bd1scan0 = data1.Scan0;
IntPtr bd2scan0 = data2.Scan0;
int stride = data1.Stride;
int len = stride * bitmap1.Height;
return memcmp(bd1scan0, bd2scan0, len) == 0;
}
finally
{
bitmap1.UnlockBits(data1);
bitmap2.UnlockBits(data2);
}
}
Possivelmente no futuro, mudarei para o Mirage.
E dica a todos que pensam em fazer ferramentas que já existem no mercado, ou que o chefe tenha pedido para fazer: é FURADA. Praticamente todo mundo fica comparando a sua ferramenta (que você fez em uns 2 meses), com a versão 12 do TeamViewer que tem uma equipe de profissionais altamente capacitados e especializados nisso. [Ô]Por que o seu VNC não é tão rápido quanto o TeamViewer? Por que seu VNC gasta mais processamento que o TeamViewer? Mas o Teamviewer mostra as janelas UAC, por que o seu não mostra?[Ô].
Foda galera, foda...
Irei fechar o tópico, mas deixarei aberto mais um pouco caso alguém queira fazer um comentário.