Я изучаю WCF, LINQ и несколько других технологий, пишу с нуля, обычное приложение для дистанционного управления, такое как VNC. Я создаю его с учетом трех основных целей:
- Сервер будет предоставлять "дистанционное управление" на уровне приложений (то есть без окон) вместо полного доступа к рабочему столу.
- Клиент может выбрать любое количество приложений, работающих на сервере, и получать поток изображений каждого из них.
- Клиент может подключаться к нескольким серверам одновременно.
Сейчас я использую WCF для отправки массива байтов, который представляет отправленное окно:
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;
Затем он отправляется через WCF (TCPBinding и всегда будет по локальной сети) клиенту и реконструируется в пустой форме окна без такой границы:
using (var ms = new MemoryStream(_currentFrame.Snapshot))
{
BackgroundImage = Image.FromStream(ms);
}
Я хотел бы сделать этот процесс максимально эффективным как в CPU, так и в использовании памяти с пропускной способностью, идущей на третье место. Я хочу, чтобы клиент подключился к 5+ серверам с 10 приложениями на сервер.
Является ли мой существующий метод лучшим подходом (продолжая использовать эти технологии), и есть ли что-нибудь, что я могу сделать для его улучшения?
Идеи, которые я ищу (но у меня нет опыта):
- Использование графической библиотеки с открытым исходным кодом для захвата и сохранения изображений вместо решения .Net.
- Сохранение как PNG или другого типа изображения, а не JPG.
- Каждый раз отправляйте изображение deltas вместо полного изображения.
- Попробуйте "записать" окна и создать сжатый видеопоток вместо снимков (mpeg?).