Эффективный способ отправить изображения через WCF?

Одна очевидная вещь, еще не упомянутая, это может быть оба про или обманным (и то же для обоих), то, что они - протоколы двоичной синхронной передачи данных. Это допускает более компактное представление и возможно больше производительности (профессионалы), но с уменьшенной удобочитаемостью (или скорее debuggability), довод "против".

кроме того, у обоих есть бит меньше поддержки инструмента, чем стандартные форматы как xml (и возможно даже json).

(РЕДАКТИРОВАНИЕ) Здесь Интересное сравнение , который занимается обоими размерами & различия в производительности, и включают числа для некоторых других форматов (xml, json) также.

24
задан InvertedAcceleration 5 December 2009 в 15:02
поделиться

6 ответов

Обратите внимание на следующие моменты:

  • Транспорт: кодирование TCP / двоичного сообщения будет самым быстрым способом передачи данных изображения
  • Захват изображения: вы можете положиться на P / Invoke для доступа к данным экрана, так как это может быть быстрее и потреблять больше памяти. Некоторые примеры: Захват изображения экрана в C # [P / Invoke] , Как сделать снимок экрана с помощью .NET [Managed] и Захват снимков экрана с помощью C # (Managed)
  • Перед отправкой необходимо уменьшить объем данных изображения;
    • выбирайте формат изображения с умом, так как некоторые форматы имеют собственное сжатие (например, JPG)
    • пример должен быть Найти различия между изображениями C #
    • отправляет только изображение сравнения, вы можете обрезать его и просто отправлять не -пустые области
  • Попробуйте проверить ваши сообщения WCF. Это поможет вам понять, как форматируются сообщения, и поможет определить, как уменьшить их размер.

Просто после того, как выполнили все эти шаги и остались довольны своим окончательным кодом, вы можете скачать Исходный код VncSharp . Он реализует протокол RFB (запись в Википедии) , «простой протокол для удаленного доступа к графическим пользовательским интерфейсам. Поскольку он работает на уровне фреймбуфера, он применим ко всем оконным системам и приложениям. , включая X11, Windows и Macintosh. RFB - это протокол, используемый в VNC (виртуальных сетевых вычислениях). "

21
ответ дан 29 November 2019 в 00:04
поделиться
4
ответ дан 29 November 2019 в 00:04
поделиться

Вместо того, чтобы захватывать все изображение, просто отправляйте меньшие части изображения. Значение: начиная с левого верхнего угла, отправьте изображение размером 10x10 пикселей, затем «переместите» десять пикселей и отправьте следующий квадрат 10 пикселей и так далее. Затем вы можете отправить десятки небольших изображений, а затем обновить нарисованное полное изображение на клиенте. Если вы использовали RDC для просмотра изображений на удаленном компьютере, вы, вероятно, видели, как он рисует такой вид экрана.

Используя меньшие разделы изображения, вы также можете разделить дельты, так что, если ничего не изменилось в текущий раздел вы можете спокойно пропустить, сообщить клиенту, что вы его пропускаете, а затем перейти к следующему разделу.

Вы определенно захотите использовать сжатие для отправки изображений. Однако вы должны проверить, получаете ли вы меньшие размеры файлов от использования сжатия, аналогичного gZip, или использование кодека изображений дает лучшие результаты. Я никогда не проводил сравнения, поэтому не могу сказать наверняка, так или иначе.

0
ответ дан 29 November 2019 в 00:04
поделиться

Самый быстрый способ пересылки данных между клиентом и сервером - это пересылка байтового массива или нескольких байтовых массивов. Таким образом, WCF не нужно выполнять какую-либо настраиваемую сериализацию ваших данных.

Тем не менее. Вы должны использовать новую библиотеку WPF / .Net 3.5 для сжатия изображений вместо изображений из System.Drawing. Функции в пространстве имен System.Windows.Media.Imaging быстрее, чем старые, и все еще могут использоваться в winforms.

Чтобы узнать, подходит ли сжатие, вам нужно будет протестировать свой сценарий, чтобы узнать как время сжатия / распаковки по сравнению с передачей всех байтов без сжатия.

Если вы передаете данные через Интернет, сжатие обязательно поможет. Между компонентами на одной машине или в локальной сети преимущество может быть не столь очевидным.

Вы также можете попробовать сжать изображение, затем разбить данные и отправить асинхронно с идентификатором фрагмента, который вы вместе задаете на клиенте. TCP-соединения запускаются медленно и со временем увеличивают пропускную способность, поэтому одновременный запуск двух или четырех должен сократить общее время передачи (все зависит от того, сколько данных вы отправляете). Разделение байтов сжатых изображений также проще с точки зрения логики, чем создание тайлов в реальных изображениях.

Подведены итоги : System.Windows.Media.Imaging должен помочь вам с точки зрения ЦП и пропускной способности по сравнению с вашим текущим кодом. Что касается памяти, я бы предположил примерно то же самое.

поэтому запуск двух или четырех одновременно должен сократить общее время передачи (все зависит от того, сколько данных вы отправляете). Разделение байтов сжатых изображений также проще с точки зрения логики, чем создание тайлов в реальных изображениях.

Подведены итоги : System.Windows.Media.Imaging должна помочь вам как с точки зрения ЦП, так и с точки зрения пропускной способности по сравнению с вашим текущим кодом. Что касается памяти, я бы предположил примерно то же самое.

поэтому запуск двух или четырех одновременно должен сократить общее время передачи (все зависит от того, сколько данных вы отправляете). Разделение байтов сжатых изображений также проще с точки зрения логики, чем создание тайлов в реальных изображениях.

Подведены итоги : System.Windows.Media.Imaging должна помочь вам как с точки зрения ЦП, так и с точки зрения пропускной способности по сравнению с вашим текущим кодом. Что касается памяти, я бы предположил примерно то же самое.

1
ответ дан 29 November 2019 в 00:04
поделиться
  1. Ваше решение мне нравится, но я предлагаю (как и другие) использовать плитки и сжимать трафик, когда это возможно. Кроме того, я думаю, вам следует время от времени отправлять все изображение, просто чтобы убедиться, что дельты клиента имеют общую «основу».

  2. Возможно, вы можете использовать существующее решение для потоковой передачи, такое как RTP-H263 для видео потоковое. Он отлично работает, использует сжатие, хорошо документирован и широко используется. Затем вы можете пропустить часть WCF и перейти непосредственно к потоковой части (через TCP или UDP). Если ваше решение будет запущено в производство, возможно, потоковый подход H263 будет лучше с точки зрения скорости отклика и использования сети.

0
ответ дан 29 November 2019 в 00:04
поделиться

Некоторое время назад я работал над подобным проектом. Это был мой общий подход:

  • Растеризация захваченного растрового изображения в плитки размером 32x32
  • Чтобы определить, какие плитки были изменены между кадрами, я использовал небезопасный код, чтобы сравнить их по 64 бита за раз
  • На наборе дельта-плиток Я применил один из фильтров PNG для улучшения сжимаемости и добился лучших результатов с фильтром Paeth
  • Используется DeflateStream для сжатия отфильтрованных дельт
  • Используется BinaryMessageEncoding custom привязка к службе для передачи данных в двоичном формате вместо версии по умолчанию в кодировке Base64

Некоторые соображения на стороне клиента. При работе с большими объемами данных, передаваемых через службу WCF, я обнаружил, что некоторые параметры HttpTransportBinding и XmlDictionaryRenderQuotas были установлены на довольно консервативные значения. Так что вам захочется их увеличить.

4
ответ дан 29 November 2019 в 00:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: