Estoy aprendiendo WCF, LINQ y algunas otras tecnologías al escribir, desde cero, una aplicación de control remoto personalizada como VNC. Lo estoy creando con tres objetivos principales en mente:¿Manera eficiente de enviar imágenes a través de WCF?
- El servidor proporcionará 'control remoto' en un nivel de aplicación (es decir, ventanas integradas) en lugar de acceso completo al escritorio.
- El cliente puede seleccionar cualquier cantidad de aplicaciones que se ejecutan en el servidor y recibir una secuencia de imágenes de cada una de ellas.
- Un cliente puede conectarse a más de un servidor simultáneamente.
En este momento estoy usando WCF para enviar una matriz de bytes que representa la ventana que se envía: aplicación
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;
Se envía a través de WCF (TCPBinding y siempre estará en LAN) al cliente y reconstruido en un formulario de Windows en blanco sin ningún borde como este:
using (var ms = new MemoryStream(_currentFrame.Snapshot))
{
BackgroundImage = Image.FromStream(ms);
}
Me gustaría hacer que este proceso sea lo más eficiente posible tanto en el uso de la CPU como de la memoria con el ancho de banda en tercer lugar. Mi objetivo es que el cliente se conecte a más de 5 servidores con más de 10 aplicaciones por servidor.
¿Es mi método actual el mejor enfoque (mientras sigo usando estas tecnologías) y hay algo que pueda hacer para mejorarlo?
ideas que busco en (pero no tengo ninguna experiencia con):
- utilización de biblioteca de gráficos de código abierto para capturar y guardar las imágenes en lugar de la solución .NET.
- Guardando como PNG u otro tipo de imagen en lugar de JPG.
- Enviar deltas de imagen en vez de una imagen completa todo el tiempo.
- Pruebe y "grabe" las ventanas y cree una secuencia de video comprimido en lugar de instantáneas de imágenes (¿mpeg?).
Ya he leído esa sección en msdn antes de hacer la pregunta aquí ... Tengo muchas ganas de entender qué debería cambiarse en mi enfoque y por qué. – InvertedAcceleration