|
|
||||||
GetPixel() работает нереально медленно на Windows 717.02.2011, 10:48. Показов 24848. Ответов 67
Метки нет (Все метки)
Написал программу (бот для онлайн игры), вся его работа заключается в получении цвета пикселя в нужных координатах и совершения тех или иных деййствий в зависимости от полученного цвета. Стояла ХР, все работало прекрасно, но вот решил попробовать семерку и столкнулся с необъяснимой вещью - бот нереально тупит. Например в самом начале он ищет окно игры в браузере (всмысле его координаты) а потом в этом окне находит нужную кнопку по ее цвету:
Добавлено через 9 минут поечему я решил что тормозит именно GetPixel()? - потому, что больше тут тормозить не чему)
1
|
||||||
| 17.02.2011, 10:48 | |
|
Ответы с готовыми решениями:
67
Несколько GetPixel с экрана - код работает слишком медленно
Медленно работает Windows 7 |
|
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
|
|
| 17.02.2011, 10:50 | |
|
попробуй CDC::GetPixel или CImage::GetPixel
0
|
|
|
|
||||||
| 17.02.2011, 20:47 [ТС] | ||||||
|
Anton_Grey, на сколько я понял это MFC, я пишу пока без этого.
Добавлено через 48 минут Да, еще забыл упомянуть, все это дело происходит в созднном потоке, в основном потоке у меня обработка сообщений главного окна. Добавлено через 8 часов 59 минут Попробовал такой код:
0
|
||||||
|
5 / 5 / 1
Регистрация: 16.01.2011
Сообщений: 28
|
|
| 17.02.2011, 22:12 | |
|
Попробовал у себя, такая же проблема. Даже не знаю с чем связано.
![]() Попробую на Wasm'e спросить.
0
|
|
|
|
||
| 18.02.2011, 09:24 [ТС] | ||
|
При чем вот что еще интересно, я бота выкинул в инет, люди качают и пишут отзывы, так вот у некоторых на семерке все отлично работает Я вот уже думаю, может в самой ОС нужно какие-то настройки сделать, не может быть, чтоб к системным бибилиотекам был такой медленный доступ и ф-ции из этих бибилиотек так сильно тупили. Разаработчики тогда бы просто прокляли семерку и ни кто под нее бы не писал)
0
|
||
|
|
|
| 20.02.2011, 16:18 | |
|
Я не специалист по графике. И практически не имею опыта работы под Windows. Но из общих соображений могу высказать причину тормозов. Тем более, что с похожей проблемой мы сталкивались с #pragma'ой, когда он использовал библиотеку SDL.
Любая работа с графикой - это работа с устройством (видеокартой) посредством драйвера. Видеокарта и драйвер как правило настроены таким образом, что самый эффективный способ обращения - страничный. Т.е. одним махом записывается целый кадр (экран) или одним махом считывается значение кадра. При таком раскладе чтобы отобразить точку делается чтение всего экрана, замена одной точки и потом запись всего экрана. Поэтому чтобы по точкам прорисовать экран при разрешении 640 на 480 требуется соответствующее количество последовательных чтений-записей всего экрана. Поэтому правильная работа заключается в том, что сначала в памяти формируется образ всей картинки, а потом оно одним махом отправляется на устройство. Обратная работа (чтение точки с экрана), скорее всего, построена по тому же принципу. Читается весь экран, а потом выдаётся информация об одной точке. Тот факт, что на разных системах GetPixel работает с разной скоростью скорее всего говорит о следующем. При первом вызове GetPixel прочитается весь экран и выдастся значение конкретной точки. При последующем вызове делается проверка, изменилось ли состояние экрана с предыдущего вызова. Если не изменилось, то считываем значение точки в образе памяти, оставшемся от предыдущего вызова GetPixel (т.е. без обращения к устройству, которое очень медленное). Если изменилось, то ничего не остаётся делать, как заново прочитать весь экран. И в твоём случае проблема скорее всего растёт из того, что при последующем вызове считается, что состояние экрана изменилось. Это может зависет от конкретной реализации конкретного драйвера. В принципе, это может зависеть и от того, распахнуто окно программы во весь экран или нет, имеется ли какая-нибудь фигня в tray и прочей всякой лажи. Понятно, что в случае оконного приложения данные считываются не с экрана, а с виртуального устройства (оно Device Context или что-то в этом духе вроде бы называется), а потому возникает ещё куча программных прослоек, в которых могут возникать эти самые непонятки. На мой взгляд проблему надо решать тем, что вместо кучи вызовов GetPixel нужно сделать один вызов, который читает весь образ экрана (а точнее, весь образ Device Context'а) в память, а дальше уже ковыряться в этой памяти. Независимо ни от чего такой вариант был бы куда более правильный, чем то, что у тебя написано, а потому даже если это не поможет, лучше работать именно так Добавлено через 6 минут Кстати, цикл в строках 14-20 - это какой-то мёртвый код, который 10 раз сравнивает две переменные, которые внутри цикла не меняются. По логике "clf=..." и "but.y++" должны находиться внутри цикла, а не снаружи. Ну вобщем ладно, это уже твоя кухня...
1
|
|
|
|
|||||||
| 20.02.2011, 16:40 [ТС] | |||||||
|
Добавлено через 4 минуты Evg, скажи еще, разумно ли так делать:
0
|
|||||||
|
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
|
||||||
| 20.02.2011, 17:23 | ||||||
|
Kastaneda, если не против могу ответить я)
Это действительно очень сильно загрузит ЦП. Обычно я поступаю так, если необходимо оперативно в реальном времени снимать какие то данне. создаю для этих нужд отдельный поток, в потоковой функции у меня следуйший код:
Добавлено через 2 минуты Так же можно приципить Event. То есть при необходимости дать знать потоку, что пора закончить работу.
1
|
||||||
|
160 / 159 / 13
Регистрация: 14.01.2010
Сообщений: 1,497
|
|
| 20.02.2011, 17:35 | |
|
Когда то делал GetPixel на vc++ на xp очень медленно пполучалось, перевел на делфи и скорость резко возраста. Это просто наблюдение мое частное.
На api не делал ни чего, но думаю можно создать свой dc CreateCompatibleDC и bitblt скопировать в него экран, а потом GetPixel.
0
|
|
|
|
||||||||
| 20.02.2011, 17:37 [ТС] | ||||||||
|
По WInAPI ни чего не читал (вернее когда-то начинал читать книгу, потом забросил), осваиваю методом тыка, поэтому не понимаю, зачему нужно:
0
|
||||||||
|
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
|
||
| 20.02.2011, 17:43 | ||
|
ReleaseDC если быть точным, то:
Event, CreateEvent сигналы. Подробнее тоже можно узнать в MSDN, если есть время чуть поэже скину ЛС как пользоваться.
0
|
||
|
|
||||||
| 20.02.2011, 17:49 [ТС] | ||||||
|
А чем чревато "забыть" включить в код ReleaseDC(). У меня в коде этого ни где не делается)
Вот твой код
0
|
||||||
|
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
|
||
| 20.02.2011, 17:58 | ||
|
Kastaneda, чем это черевато я точно тебе сказать не могу. вот что пишет тот же MSDN
в описании GetDC
Короче дурной тон так поступать, возможно в этом и причина тормозов на семерке.
0
|
||
|
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
|
|
| 20.02.2011, 18:05 | |
|
Kastaneda, за приделами вызывай GetDC, думаю система не будет против)
0
|
|
|
|
||
| 20.02.2011, 18:08 | ||
|
1
|
||
|
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
|
|
| 20.02.2011, 18:08 | |
|
влзможно после обноления окна сторонего процесса, HDC уже будет не актуален.
так что для строховки повторный вызов и освобождение. понимаю, хочется уменьшить код, но для коректной работы это не выход.
1
|
|
|
|
||
| 20.02.2011, 18:14 | ||
|
0
|
||
|
59 / 59 / 2
Регистрация: 22.01.2011
Сообщений: 187
|
|
| 20.02.2011, 18:20 | |
|
Evg, Respekt)
0
|
|
|
|
|||||||
| 20.02.2011, 18:22 [ТС] | |||||||
, но факты говорят об обратном...
0
|
|||||||
| 20.02.2011, 18:22 | |
|
Помогаю со студенческими работами здесь
20
Windows XP медленно работает USB работает медленно (Windows 7) Windows XP работает слишком медленно Медленно работает Аксесс 97 под Windows 7 После переустановки Windows 7 медленно работает система Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2.
Задача: отобразить спецтехнику, которая на данный момент находится в ремонте.
Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
|
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
|
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|