Коллеги, после пары лет в QT нужно вернуться к софту, написанному на MFC и добавить кое-какую функциональность.
А именно: с заданной периодичностью нужно сравнивать содержимое окна с копией экрана в памяти.
Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды.
Здравствуйте, aloch, Вы писали:
A>Здравствуйте, VSilchenko, Вы писали:
VS>>Подскажите, плз, в каком направлении двигаться.
A>Сравнивать _две_ копии экрана в памяти. И при чем здесь MFC и Qt ?
MFC — сама програма написана с использованием MFC.
Qt — просто к тому, что после нескольких лет в Qt в MFC всё кажется непривычным и непонятным.
Насчет сравнивания в памяти — это и ежу понятно. Вопрос в том, как это сделать эффективно.
Если есть готовый пример — был бы весьма плагодарен.
А советы типа 'сравнить две копии' или 'гуглить GetDIBits' я и сам себе могу дать
А сравнение зависит от того, что ты под этим понимаешь. Если просто похоже/непохоже, то сравниваем битмапы попиксельно (конечно не через GetPixel, а как две последовательности RGB(A) в памяти). Или что-то более сложное (найти зоны отличий/совпадений)?
Здравствуйте, VSilchenko, Вы писали: VS>Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды. VS>Подскажите, плз, в каком направлении двигаться.
Как вариант можно сравнивать сумму argb пикселей экранов, и не подряд, а допустим через каждые 100.
Здравствуйте, Serpuh, Вы писали:
S>Здравствуйте, VSilchenko, Вы писали: VS>>Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды. VS>>Подскажите, плз, в каком направлении двигаться.
S>Как вариант можно сравнивать сумму argb пикселей экранов, и не подряд, а допустим через каждые 100.
Здравствуйте, aloch, Вы писали: S>>Как вариант можно сравнивать сумму argb пикселей экранов, и не подряд, а допустим через каждые 100. A>А зачем?
Для ускорения операции, ТС пишет что надо делать в доли секунды. Суммирование можно быстро сделать, а оператор if будет всего один. Думаю качественно так можно определить менялась ли картинка. Хотя могу и ошибаться.
Здравствуйте, Serpuh, Вы писали:
S>Для ускорения операции, ТС пишет что надо делать в доли секунды. Суммирование можно быстро сделать, а оператор if будет всего один. Думаю качественно так можно определить менялась ли картинка. Хотя могу и ошибаться.
Для ускорения лучше вообще ничего не сравнивать, чем сравнивать так.
Здравствуйте, aloch, Вы писали: A>Для ускорения лучше вообще ничего не сравнивать, чем сравнивать так.
Ну и за одно каков твой молниеносный алгоритм сравнивания картинок с 2млн. пикселей?
Здравствуйте, Serpuh, Вы писали:
S>Лучше вообще ничего не писать, чем писать так.
Ок. Почему именно через 100 пикселей, а не через 200 или 50 или 10? Почему не просто сравнивать все пиксели на диагоналях или скажем по спирали от центра против часовой стрелки с шагом 10?
Твое сравнение (и все остальные) не является сравнением, т.к. в очень большом количестве случаев оно скажет что все совпало, хотя совпадения нет и в помине! Зачем тогда вообще сравнивать?
Если нужен точный ответ, то сравнивать придется _все_ пискли, если точный ответ не нужен, то зачем сравнивать? можно просто использовать rnd() — так гораздо быстрее.
При этом если экран поменялся, то при последовательном сравнении мы быстро наткнемся на изменившейся пиксель. И скорее всего, если он изменился сейчас, то и в следующий раз изменится скорее всего он, или кто-то рядом с ним. Значит нужно в следующий начинать сравнение с него и его соседий. Вот это уже точный и при этом более быстрый способ.
Здравствуйте, aloch, Вы писали: A>Ок. Почему именно через 100 пикселей, а не через 200 или 50 или 10? Почему не просто сравнивать все пиксели на диагоналях или скажем по спирали от центра против часовой стрелки с шагом 10?
A>Твое сравнение (и все остальные) не является сравнением, т.к. в очень большом количестве случаев оно скажет что все совпало, хотя совпадения нет и в помине! Зачем тогда вообще сравнивать?
Ок, давай брать через 2 пикселя, тогда все покажет. Только вопрос в том что надо отследить: что набили еще одну букву, или со студии на игруху переключились. Отсюда надо и плясать, т.к. самой дорогой по времени здесь все равно будет GetPixel().
Здравствуйте, aloch, Вы писали: A>или скажем по спирали от центра против часовой стрелки с шагом 10? A>можно просто использовать rnd() — так гораздо быстрее.
Да, про rnd() не знаю, но sin() cos() для спирали точно долгие операции.
Здравствуйте, Serpuh, Вы писали:
S>Здравствуйте, aloch, Вы писали: A>>Ок. Почему именно через 100 пикселей, а не через 200 или 50 или 10? Почему не просто сравнивать все пиксели на диагоналях или скажем по спирали от центра против часовой стрелки с шагом 10?
A>>Твое сравнение (и все остальные) не является сравнением, т.к. в очень большом количестве случаев оно скажет что все совпало, хотя совпадения нет и в помине! Зачем тогда вообще сравнивать?
S>Ок, давай брать через 2 пикселя, тогда все покажет. Только вопрос в том что надо отследить: что набили еще одну букву, или со студии на игруху переключились. Отсюда надо и плясать, т.к. самой дорогой по времени здесь все равно будет GetPixel().
Отследить нужно, как я понимаю все, все. Ответ "экран не изменился менее чем на 1% и мы считаем, что он не изменился" — это не ответ. А если отслеживать "со студии на игруху переключились", то отслеживать нужно не экран, а активный процесс, с которым работает USER.
Здравствуйте, Serpuh, Вы писали:
S>Здравствуйте, aloch, Вы писали: A>>или скажем по спирали от центра против часовой стрелки с шагом 10? A>>можно просто использовать rnd() — так гораздо быстрее.
S>Да, про rnd() не знаю, но sin() cos() для спирали точно долгие операции.
Здравствуйте, aloch, Вы писали: A>Отследить нужно, как я понимаю все, все. Ответ "экран не изменился менее чем на 1% и мы считаем, что он не изменился" — это не ответ.
Значит нет другого выхода как делать 2 дампа памяти и побайтово их сравнивать. Другое дело, что это займет всю вычислительную мощь компа, но это уже детали.
Здравствуйте, VSilchenko, Вы писали:
VS>Коллеги, после пары лет в QT нужно вернуться к софту, написанному на MFC и добавить кое-какую функциональность. VS>А именно: с заданной периодичностью нужно сравнивать содержимое окна с копией экрана в памяти.
VS>Ума не приложу, как к этому подступиться. Сравнивать попиксельно (CDC::GetPixel) — слишком медленно, нужно чтобы вся операция занимала доли секунды.
VS>Подскажите, плз, в каком направлении двигаться.