Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 24.03.04 20:06
Оценка: +1
Есть некий компьютер в сети, который должен передавать изображения на клиентские компьютеры изображение своего рабочего стола. (компьютеров в сети несколько десятков)
Посоветуйте, как достигнуть хорошей скорости отображения рабочего стола(расшареного) на каждом клиентском компьютере?

Сейчас, я делаю так. Копирую экран в буфер, произвожу сжатие и отправляю всем клиентам.
Предпологаю, что эфективнее отправлять не весь экран, а только часть которая изменилась с момента прошлого скриншота. Но как произвести быстрое определение изменённой области(разбить на инвалидированые прямоугольники), чтобы в итоге был выигрыш в скорости?

Или этого нужно достичь за счёт другой технологии передачи?

ЗЫ: Может кто встречал в сети подобные проекты с открытым кодом(желательно несложные), подходящие в качестве примера.
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re: Передача изображения(десктопа) по сети
От: PK Sly http://www.vocord.ru/
Дата: 24.03.04 21:23
Оценка:
В принципе, именно этим и занимается MPEG compressor. более того, он находит вектора смещения, функции растяжения и прочие сложные преобразования изображения.

Наилучшим способом твоя задача решена в терминальном сервисе от Микрософт. На сколько я понимаю, там перехватываются GDI-вызовы и отслеживаются все изменения. Более того, текстовая информация передаётся в виде текста, а некоторые фрагменты изображения кэшируются на клиентской стороне.
Представить себе достаточно внятно, как там всё происходит на самом деле, не могу, к сожалению.

Одно "радует" — ни одна программа для удалённого управления компом не использует этой технологии. Все передают полное изображение с небольшими fps (около пяти кадров/сек) и с урезанным цветовым разрешением (не более 256 цветов, а обычно — 16)
VAX/VMS rulez!
Re[2]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 24.03.04 21:43
Оценка:
Здравствуйте, PK Sly, Вы писали:

PS>В принципе, именно этим и занимается MPEG compressor. более того, он находит вектора смещения, функции растяжения и прочие сложные преобразования изображения.


PS>Наилучшим способом твоя задача решена в терминальном сервисе от Микрософт. На сколько я понимаю, там перехватываются GDI-вызовы и отслеживаются все изменения. Более того, текстовая информация передаётся в виде текста, а некоторые фрагменты изображения кэшируются на клиентской стороне.

PS>Представить себе достаточно внятно, как там всё происходит на самом деле, не могу, к сожалению.

PS>Одно "радует" — ни одна программа для удалённого управления компом не использует этой технологии. Все передают полное изображение с небольшими fps (около пяти кадров/сек) и с урезанным цветовым разрешением (не более 256 цветов, а обычно — 16)


Да, но при этом Винда не позволяет войти в систему "неудалённому" юзеру.

А MPEG compressor, скорее всего, ориентирован на быстрое декодирование, а не кодирование. Но тут я могу ошибаться.
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[3]: Передача изображения(десктопа) по сети
От: PK Sly http://www.vocord.ru/
Дата: 24.03.04 21:50
Оценка:
O>Да, но при этом Винда не позволяет войти в систему "неудалённому" юзеру.

Вот этого не понял

O>А MPEG compressor, скорее всего, ориентирован на быстрое декодирование, а не кодирование. Но тут я могу ошибаться.


Есть кодировщики реального времени.
Но MPEG, конечно, ориентирован на реальные изображения, а не на то, что показывают на десктопе.
VAX/VMS rulez!
Re: Передача изображения(десктопа) по сети
От: AndreyFedotov Россия  
Дата: 25.03.04 12:32
Оценка: -1
Здравствуйте, Offsider, Вы писали:

O>Есть некий компьютер в сети, который должен передавать изображения на клиентские компьютеры изображение своего рабочего стола. (компьютеров в сети несколько десятков)

O>Посоветуйте, как достигнуть хорошей скорости отображения рабочего стола(расшареного) на каждом клиентском компьютере?

O>Сейчас, я делаю так. Копирую экран в буфер, произвожу сжатие и отправляю всем клиентам.

O>Предпологаю, что эфективнее отправлять не весь экран, а только часть которая изменилась с момента прошлого скриншота. Но как произвести быстрое определение изменённой области(разбить на инвалидированые прямоугольники), чтобы в итоге был выигрыш в скорости?

O>Или этого нужно достичь за счёт другой технологии передачи?


O>ЗЫ: Может кто встречал в сети подобные проекты с открытым кодом(желательно несложные), подходящие в качестве примера.


Я бы посоветовал посмтореть материалы по H.323. Там решается подобная задача, особенно для случая нескольких пользователей... На тему упаковки — достаточно хорошо будет работать банальное попиксельное сравнение и передача только изменившихся пикселов. Если конечно ты не захочешь гнать по сети видео...
Re[2]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 25.03.04 17:50
Оценка:
Здравствуйте, AndreyFedotov, Вы писали:


AF>Я бы посоветовал посмтореть материалы по H.323. Там решается подобная задача, особенно для случая нескольких пользователей... На тему упаковки — достаточно хорошо будет работать банальное попиксельное сравнение и передача только изменившихся пикселов. Если конечно ты не захочешь гнать по сети видео...


Можешь посоветовать что нибудь конкретнее по Н323. А то я в поисковике искал, там в основном новости на эту тему...

А попиксельное сравнение я думаю не слишком подойдёт, я ж не буду по пикселю всем клиентам рассылать обновление. Мне интересно было узнать, есть ли какие нибудь быстрые алгоритмы определения изменившихся областей(прямоугольников), что бы их перерисовывать у клиентов.

ЗЫ: Конечно, видео гнать не буду...
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[3]: Передача изображения(десктопа) по сети
От: AndreyFedotov Россия  
Дата: 25.03.04 18:22
Оценка:
Здравствуйте, Offsider, Вы писали:

O>Здравствуйте, AndreyFedotov, Вы писали:



AF>>Я бы посоветовал посмтореть материалы по H.323. Там решается подобная задача, особенно для случая нескольких пользователей... На тему упаковки — достаточно хорошо будет работать банальное попиксельное сравнение и передача только изменившихся пикселов. Если конечно ты не захочешь гнать по сети видео...


O>Можешь посоветовать что нибудь конкретнее по Н323. А то я в поисковике искал, там в основном новости на эту тему...

Например: здесь

O>А попиксельное сравнение я думаю не слишком подойдёт, я ж не буду по пикселю всем клиентам рассылать обновление.

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

Как раз подойдёт. И весьма хорошо. Если меняется малая часть изображения (что бывает чаще) — то будет пересылаться минимум данных. Но! Попиксельное сравнение — не самая быстрая операция. Кроме того можно разбить экран на прямоугольники — допустим 8x8 или 16x16 и сравнивать попиксельно изображения. Если хотя бы один пиксел в пределах прямоугольника отличается — пересылается прямоугольник целиком. (Кстати довольно распространённый метод ). Особенно — если сранивать пикселы не последовательно в том порядке, в каком они идут в растре, а в сеточном — то скорость сравнения в среднем будет гораздо выше.
Кадры пересылаются с помощью UDP — этот протокол позволяет одновременную отправку данных нескольким получателям.

O>ЗЫ: Конечно, видео гнать не буду...
Re: Передача изображения(десктопа) по сети
От: Candle645 Украина http://www.brainbench.com/transcript.jsp?pid=11259
Дата: 25.03.04 21:37
Оценка: 2 (1)
Здравствуйте, Offsider, Вы писали:

O>Есть некий компьютер в сети, который должен передавать изображения на клиентские компьютеры изображение своего рабочего стола. (компьютеров в сети несколько десятков)

O>Посоветуйте, как достигнуть хорошей скорости отображения рабочего стола(расшареного) на каждом клиентском компьютере?

O>Сейчас, я делаю так. Копирую экран в буфер, произвожу сжатие и отправляю всем клиентам.

O>Предпологаю, что эфективнее отправлять не весь экран, а только часть которая изменилась с момента прошлого скриншота. Но как произвести быстрое определение изменённой области(разбить на инвалидированые прямоугольники), чтобы в итоге был выигрыш в скорости?

1. GDI драйвер, кторый регистрирует все изменения или в реальном времени сообщает о них основной программе.

Дешево и сердито (пишется на коленке дня за 2-3 и работает вполне приемлимо):
2. Хранить копию экрана и с какой-то (достаточно высокой) частотой сравнивать и синхронизировать ее с реальной картинкой.
Сравнение построчное (или блоками по неаколько строк, но <32K по размеру). Все буфера вировнять на границу DWORD.
Провярять весь экран за каждый проход — необязательно, вполне приемлимые варианты четные/нечетные, 1-2-3, 1-2-3-4 + проверка соседних с измененными полос. Каждый n-ный кадр посылать весь экран целиком.
Чтение с экрана — банальный GetDIBits()
Упаковка — сначала RLE с размером слова равным глубине цвета (по эффективности сжатия почти не уступает формированию палитры вручную из наиболее используемых цветов, но работает гораздо быстрее), потом сверху какой-нибудь gzip.
При попадании в очередь Key Frame все остальние дропать.
При частоте 25 кадров в секунду с каждым 25 ключевым кадром и бинес-графике (Вижуал, офис и т.д.) на экране 1024x768x24bpp
трафик порядка полтора метра в сукунду и почти полное отсутствие артефактов из-за неполной прповерки на изменения.

O>Или этого нужно достичь за счёт другой технологии передачи?


Транспорт — UDP (желательно Multicast).

O>ЗЫ: Может кто встречал в сети подобные проекты с открытым кодом(желательно несложные), подходящие в качестве примера.


VNC Server
Re[2]: Передача изображения(десктопа) по сети
От: PK Sly http://www.vocord.ru/
Дата: 26.03.04 18:08
Оценка: -1
Вы его видели этот H.323 ?
А зачем советуете?
VAX/VMS rulez!
Re[3]: Передача изображения(десктопа) по сети
От: Candle645 Украина http://www.brainbench.com/transcript.jsp?pid=11259
Дата: 26.03.04 19:21
Оценка: -1
Здравствуйте, PK Sly, Вы писали:

PS>Вы его видели этот H.323 ?


Только по диагонали. Всерьез приходилось разбираться с семейством T122.
PS>А зачем советуете?

Не советовал но видел.
Совет почти нормальный. —
1.Общая теория никогда не бывает лишней.
2.Если всерьез озаботиться поиском H323, обязательно придется обратить внимание на стандарты типа H261-263 и T122, которые, если заниматься задачей всерьез очень даже по теме
Re[2]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 27.03.04 18:36
Оценка:
Здравствуйте, Candle645, Вы писали:


C>Упаковка — сначала RLE с размером слова равным глубине цвета (по эффективности сжатия почти не уступает формированию палитры вручную из наиболее используемых цветов, но работает гораздо быстрее), потом сверху какой-нибудь gzip.


Не подскажите, как преобразовать палитру в 16ти битную (например)?
И как упаковать по RLE с размером слова равным глубине цвета?

C>Транспорт — UDP (желательно Multicast).

А UDP гарантирует, что если я пошлю блок размером 100к, то не дойдёт двумя по 50к (например)?
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[3]: Передача изображения(десктопа) по сети
От: PK Sly http://www.vocord.ru/
Дата: 28.03.04 07:29
Оценка:
O>А UDP гарантирует, что если я пошлю блок размером 100к, то не дойдёт двумя по 50к (например)?

да, гарантирует. но чем больше пакет, тем теньше вероятность, что он вообще дойдёт да и в виндах есть ограничение на максимальный размер сообщения в message-oriented sockets. Оно значительно меньше 100Кб.
VAX/VMS rulez!
Re[4]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 28.03.04 10:54
Оценка:
Здравствуйте, PK Sly, Вы писали:

O>>А UDP гарантирует, что если я пошлю блок размером 100к, то не дойдёт двумя по 50к (например)?


PS>да, гарантирует. но чем больше пакет, тем теньше вероятность, что он вообще дойдёт да и в виндах есть ограничение на максимальный размер сообщения в message-oriented sockets. Оно значительно меньше 100Кб.



Блин, и что делать?
Как реализовать поставленную задачу? Может connection-oriented реализовывать?
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[4]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 28.03.04 12:23
Оценка:
Здравствуйте, PK Sly, Вы писали:

O>>А UDP гарантирует, что если я пошлю блок размером 100к, то не дойдёт двумя по 50к (например)?


PS>да, гарантирует. но чем больше пакет, тем теньше вероятность, что он вообще дойдёт да и в виндах есть ограничение на максимальный размер сообщения в message-oriented sockets. Оно значительно меньше 100Кб.


Попутный вопрос.
Какова разница в скорости обработки одной команды SendTo (Multicast) и несколько SendTo (To one).
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[5]: Передача изображения(десктопа) по сети
От: PK Sly http://www.vocord.ru/
Дата: 28.03.04 18:45
Оценка:
O>Попутный вопрос.
O>Какова разница в скорости обработки одной команды SendTo (Multicast) и несколько SendTo (To one).

Если работа происходит в асинхронном режиме, то без разницы (я надеюсь, речь идёт именно об этом режиме? )
VAX/VMS rulez!
Re[5]: Передача изображения(десктопа) по сети
От: PK Sly http://www.vocord.ru/
Дата: 28.03.04 18:47
Оценка:
O>Блин, и что делать?
O>Как реализовать поставленную задачу? Может connection-oriented реализовывать?

естественно. TCP с этим вполне справяляется.
VAX/VMS rulez!
Re[6]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 28.03.04 19:56
Оценка:
Здравствуйте, PK Sly, Вы писали:


PS>естественно. TCP с этим вполне справяляется.


А как же скорость? У меня ведь может быть много получателей?
Или TCP сдесь лучший вариант(учитывая все за и против)?
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
Re[6]: Передача изображения(десктопа) по сети
От: Offsider Украина  
Дата: 28.03.04 19:59
Оценка:
Здравствуйте, PK Sly, Вы писали:

O>>Какова разница в скорости обработки одной команды SendTo (Multicast) и несколько SendTo (To one).


PS>Если работа происходит в асинхронном режиме, то без разницы (я надеюсь, речь идёт именно об этом режиме? )


Это немного облегчает задачу(если брать за основу UDP).
ЗЫ: Хотя, странно, что разницы нет...
__________________________________________________________ :)
Compiling...
message.cpp(4):error C2059: Can't understand russian mat :'@#$^& '
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.