Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Анализ обновлений экрана

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть такая проблемка - каждых 250-300 мсек нужно снимать скриншот экрана и анализировать изменения сравнительно с предыдущим. Полное сравнение конечно возможно, но уж как-то совсем не естественно, если предположить, что пользователь просто вбивает текст. Вроде бы как бы необходимо использовать GDI-hooking, но теряюсь в том, как проанализировать, а действительно ли обновилась видимая область (допустим хук перехватил отрисовку чегой-то там, а окно, которое рисовалось - перекрыто другим окном, в котором ничего не поменялось)
Есть ли какие-то методы, статьи или просто соображения по этому поводу?
 
Спасибо

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 12:43 16-11-2004 | Исправлено: zorrack, 13:36 16-11-2004
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
делаем скриншот -> в массив
a) самое банальное - побайтно сравнивать два массива - долго.
б) рассчитываем хеш-функцию от массива и сравниваем с предыдущей
Для того, чтобы не сильно пригружать машину, можно рассчитывать хеш только по красной составляющей (к примеру). В качестве хеша можно взять суму всех байт, но это плохая функция. Можно CRC32 - но она долго считается.
 
тогда приходит на ум некий "прогрессивный метод":
картинку разбиваем на области и для каждой области "проделываем сумму". Понятно, что если первая сумма поменялась, то считать дальше нет смысла

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 20:36 16-11-2004
UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
OdesitVadim

Цитата:
делаем скриншот -> в массив

в массив очень долго, надо работать с памятью.
 

Цитата:
 можно рассчитывать хеш только по красной

А если меняется цвет например кнопки с синего на зеленый??  
 

Цитата:
тогда приходит на ум некий "прогрессивный метод":  
картинку разбиваем на области и для каждой области "проделываем сумму". Понятно, что если первая сумма поменялась, то считать дальше нет смысла

Ближе к теме...


----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 00:53 17-11-2004
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
UncoNNecteD
на счёт работі с памятью - согласен на все 100

Цитата:
А если меняется цвет например кнопки с синего на зеленый??  

Я же сказал к примеру, нужно смотреть по задаче
 
Наверное zorrack хочет сделать просмотр удалённого рабочего стола и не сильно нагружать сеть и свой комп, но он сильно будет пригружать удалённій комп (
Цитата:
каждых 250-300 мсек
)
 

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 15:45 17-11-2004
zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
All
Дело в том, что сейчас и так бъется экран на части и сравнивается каждая часть с предыдущей. В любом случае приходится пробежать через все куски (на данном этапе 8х8 или 16х16) и сравнить с предыдущим состоянием.

Цитата:
Наверное zorrack хочет сделать просмотр удалённого рабочего стола  и не сильно нагружать сеть и свой комп, но он сильно будет пригружать удалённій комп  

Задача даже не просто просмотра, а записи и последующего проигрывания. Метод записи/проигрывания уже готов. Требования к размеру цонечного файла - очень жесткие (т.е. сравнивается с такой системой как Funk Proxy).
Вопрос состоит именно в том, какими методами обеспечить минимизацию сравняемого контента. Метод предложенный OdesitVadim:

Цитата:
Понятно, что если первая сумма поменялась, то считать дальше нет смысла

не совсем то, что нужно, поскольку нужно передавать и записывать ТОЛЬКО измененные блоки.
 
 
Добавлено
UncoNNecteD

Цитата:
в массив очень долго, надо работать с памятью.  

На данном этапе:
1. Делаем скрин-шот
2. Получаем доступ к его битам (достаточно-таки долгая операция для целого десктопа - около 60-80мс для 1280х1024х24бит, Дюрон 600МГц, нВидиа ТНТ 32М)
3. Сравниваем поблоково с битами предыдущего скрин-шота
4. Измененные участки копируем в выделенный блок памяти (выделенный заранее с учетом максимально-возможного размера структуры).
5. Компрессируем нужный участок памяти
6. Отсылаем
 
Идея по оптимизации:
0. Хукаем все вызовы ГДИ функций
0а. Информацию об области, к которой применялась ГДИ функция - сохраняем в списке
1. Вместо снятия полного скрин-шота - получаем только измененные прямоугольники (если перекрываются - прямоугольник который охватывает все перекрывающиеся).
 
Вот вопрос именно состоит на счет 0 и 0а - как это возможно реализовать и каким образом получать информацию об обновленных участках, проверять - видимы ли они в данный момент и т.д.

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 17:51 17-11-2004
OdesitVadim



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Насчёт компресии стоит подумать, так как она может отнимать львиную долю времени. Нужно выбрать что-то среднее между размером и сжатием. По опыту знаю на 500Мгц Пне с 64 ОЗУ 800 на 600 в JPEG жмётся до полторы секунды.

Всего записей: 1568 | Зарегистр. 19-09-2003 | Отправлено: 21:22 17-11-2004
zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OdesitVadim
На указанной выше конфигурации: Дюрон 600МГц, нВидиа ТНТ 32М, 256М ОЗУ, 1280х1024х24бит полный экран жмется около 100мс (юзаем zLib) и результирующий файл (в зависимости от текущего состояния десктопа) 20-50Кбайт. При нормальной работе пользователя (вот типа я сижу и пишу это письмо) - изменений очень мало и время компрессии - 1-2мс (вычислено как среднее от общего затраченного времени на компрессию / количество компрессированных блоков). Т.е. в данный момент единственным местом, которое действительно необходимо оптимизировать - нахождение измененных участков экрана (опять же пункты 0 и 0а в моем предыдущем посте)

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 12:36 18-11-2004
UncoNNecteD



Silver Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
zorrack
Надо штудировать MSDN.

----------
-= Я тут чертовски давно =-

Всего записей: 4040 | Зарегистр. 21-03-2002 | Отправлено: 16:30 18-11-2004
zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
UncoNNecteD
Видимо так

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 12:01 19-11-2004
SashKa



Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А если сравнивать не побитно, а скажем так.

Цитата:
На данном этапе:  
1. Делаем скрин-шот  
2. Получаем доступ к его битам (достаточно-таки долгая операция для целого десктопа - около 60-80мс для 1280х1024х24бит, Дюрон 600МГц, нВидиа ТНТ 32М)

3. Побайтно XORим с эталоном. Там где нет изменения получаем 0, а там где есть 1
    можно даже использовать прямуюработу с регистрами.
4. Пробегаем  RLE кодером(Это очень быстро) Или используем статическое Хафмановское     сжатие - тоже быстро (как в Факсах)
5. Отсылаем.

Всего записей: 130 | Зарегистр. 20-04-2004 | Отправлено: 13:41 19-11-2004
zorrack



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
SashKa

Цитата:
Побайтно XORим с эталоном

Спасибо... будем пробовать.
Он реально может дать выигрыш относительно rep cmpsd, который юзается в memcmp?

Цитата:
А если сравнивать не побитно, а скажем так

А мы и не сравниваем побитно - мы сравниваем подвордно. Просто для BITMAP надо сделать GetDIBits, чтоб получить доступ к данным битмапки. И вот реально хотелось бы очень сократить эту операцию.

Всего записей: 244 | Зарегистр. 16-05-2003 | Отправлено: 14:18 19-11-2004
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Анализ обновлений экрана


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru