|
|
||||||
GetPixel() работает нереально медленно на Windows 717.02.2011, 10:48. Показов 24557. Ответов 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 медленно работает система Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|