Sto imparando WCF, LINQ e alcune altre tecnologie scrivendo, da zero, un'applicazione di controllo remoto personalizzata come VNC. La sto creando con tre obiettivi principali in mente:Modo efficiente per inviare immagini tramite WCF?
- Il server fornirà il "controllo remoto" a livello di applicazione (ovvero finestre senza interruzioni) anziché accesso desktop completo.
- Il client può selezionare qualsiasi numero di applicazioni in esecuzione sul server e ricevere un flusso di immagini di ciascuna di esse.
- Un client può connettersi a più di un server contemporaneamente.
In questo momento sto usando WCF per inviare un array di byte che rappresenta la finestra di essere inviato: implementazione
using (var ms = new MemoryStream()) {
window.GetBitmap().Save(ms, ImageFormat.Jpeg);
frame.Snapshot = ms.ToArray();
}
GetBitmap:
var wRectangle = GetRectangle();
var image = new Bitmap(wRectangle.Width, wRectangle.Height);
var gfx = Graphics.FromImage(image);
gfx.CopyFromScreen(wRectangle.Left, wRectangle.Top, 0, 0, wRectangle.Size, CopyPixelOperation.SourceCopy);
return image;
E 'poi inviato tramite WCF (TCPBinding e sarà sempre su LAN) al client e ricostruito in un modulo di finestre vuoto senza bordi come questo:
using (var ms = new MemoryStream(_currentFrame.Snapshot))
{
BackgroundImage = Image.FromStream(ms);
}
Mi piacerebbe rendere questo processo il più efficiente possibile sia in termini di CPU che di utilizzo della memoria con larghezza di banda in arrivo al terzo posto. Sto mirando ad avere il client connesso a 5+ server con 10+ applicazioni per server.
Il mio metodo esistente è l'approccio migliore (pur continuando a utilizzare queste tecnologie) e c'è qualcosa che posso fare per migliorarlo?
idee che sto cercando in (ma non ho alcuna esperienza con):
- utilizzando una libreria grafica open source per catturare e salvare le immagini al posto della soluzione NET.
- Salvataggio come PNG o altro tipo di immagine anziché JPG.
- Invia immagine delta anziché un'immagine completa ogni volta.
- Provare e "registrare" le finestre e creare un flusso video compresso anziché immagini istantanee (mpeg?).
Ho già letto quella sezione su msdn prima di fare la domanda qui ... Sono molto curioso di capire cosa dovrebbe essere cambiato nel mio approccio e perché. – InvertedAcceleration