JEITO MAIS R?PIDO DE CAPTURAR A TELA

DS2T 20/02/2017 10:54:52
#471820
Bom dia, pessoal!
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!
KERPLUNK 22/02/2017 17:10:52
#471881
Resposta escolhida
Eu começaria uma pesquisa sobre o que usar, baseado em gravadores de tela. Lembro de ter visto algo assim antes de gravar os vídeos pro canal. Alguns até usam engine própria para compressão do vídeo, outros gravam dados crus mesmo, o que cria arquivos gigantes, logo muita coisa para ser transmitida como o que você quer. Por isso, compressão de vídeo é o maior gargalo.
DS2T 24/02/2017 09:19:33
#471921
Olá Kerplunk!
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!
DS2T 18/03/2017 19:15:45
#472517
Só pra dar o retorno: Ontem finalizei o projeto.
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!
KERPLUNK 19/03/2017 20:04:42
#472525
SPOILER: Estou já tem um tempinho com idéia de criar um canal no youtube com gameplays(em inglês) e pesquisei vários softwares para captura de vídeo(incluindo para jogos 3D totalmente dependentes do DirectX), mas a maioria não tinha um desempenho satisfatório, obviamente por causa da minha máquina. O único que tinha o desempenho realmente bom era o FRAPS, mas é pago e eu não queria investir, por enquanto. Então, comecei a desenvolver o meu e como você notou, a coisa é mais complicada do que parece. Praticamente todos acabam caindo no BitBlt de uma forma ou de outra, e com isso, comprometendo performance e qualidade. Como precisava que os vídeos fossem em HD e qualidade é essencial, acabei comprando um desses, que não só grava vídeos à 60fps, como também não interfere em absolutamente nada na performance da máquina, o que não ocorre com um sistema de gravação por software. Como o seu caso é completamente diferente e o que você quer não é bem o mesmo que eu quero, acho que você tirou coelho da cartola!
DS2T 21/03/2017 17:47:06
#472592
Bem legal esse aparelho, meu tio comprou um parecido para fazer gameplay e gostou bastante. A imagem é de altíssima qualidade.

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
KERPLUNK 21/03/2017 18:57:53
#472596
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.
JONATHANSTECKER 22/03/2017 13:33:08
#472614
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
DS2T 22/08/2017 08:31:10
#475924
Estou fechando meus tópicos antigos, e acho legal dar uma satisfação sobre o fim da coisa.

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.
Tópico encerrado , respostas não são mais permitidas