Я изучаю 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);
}
Я хотел бы сделать этот процесс как можно более эффективным при использовании как процессора, так и памяти, с пропускной способностью на третьем месте. Я хочу, чтобы клиент подключился к 5+ серверам с 10+ приложениями на сервер.
Является ли мой существующий метод лучшим подходом (продолжая использовать эти технологии), и могу ли я что-то сделать для его улучшения?
Идеи, которые я изучаю (но у меня нет опыта):
- Использование графической библиотеки с открытым исходным кодом для захвата и сохранения изображений вместо .Net решения.
- Сохранение в формате PNG или другого типа изображения, а не JPG.
- Каждый раз отправлять дельты изображения вместо полного изображения.
- Попробуйте «записать» окна и создать сжатый видеопоток вместо снимков изображения (mpeg?).