Написал программу, вся её работа заключается в получении цвета пикселя в нужных координатах и совершения тех или иных деййствий в зависимости от полученного цвета. Стояла ХР, все работало прекрасно, но вот решил попробовать семерку и столкнулся с необъяснимой вещью - программка нереально тупит. К примеру: Код (Text): for(int i=0;i<1000;i++) GetPixel(bla,bla,bla); Такой код выполняется порядка 30 секунд. А единичный вызов приводит к задержке в несколько секунд Почему на Windows 7 так медленно работает эта API функция? И можно ли её заменить?
Есть функция bitblt если интересно то выше в теме: "покерный бот" есть код, если есть вопросы там же и спроси
Не используй GetPixel, получи сразу нужную область через GetDIBits, а потом обрабатывай. Совершать тыщу вызовов гетпиксел - ну бред же, согласись)
Тестовый сорс в студию. Сделать такую задержку для единичного вызова невозможно как неоптимально ни делай. Все указывает на глючный антивирус\троян\вирус\софт удаленного рабочего стола\глючный видео драйвер\багу в твоей проге. Кто тебя знает, может у тебя там уже давно экран перехватывается и в сеть шлется.
Вот такой код, протестирован на Win7 выполняется порядка 2 секунд Код (Text): HDC hdc=GetDC(0); GetPixel(hdc,but.x,but.y) Проблема заключалась в том, что если получать пиксель используя хэдл рабочего стола (или контекст ус-ва, связанный с раб. столом, то ф-ция тормозит, если использовать например хэндл браузера, то ф-ция работают нормально.
хендл браузера это как? приведи пример когда работает нормально с теми же GetDC/GetPixel кажется, я догадываюсь в чем причина твоих тормозов.
Ничего не понимаю 2 недели назад такой код выполнялся около 7 секунд, сегодня проверил практически моментально, мистика! Код (Text): int main(){ DWORD A1, A2; A1 = GetTickCount(); COLORREF clf; HWND desktop=GetDesktopWindow(); RECT rect; GetWindowRect(desktop,&rect);//получаем разрешение экрана int x=300; int y=300; HDC hdc=GetDC(0); A2 = GetTickCount(); for (int i = 0; i < 25; i++){ clf = GetPixel(hdc,x,y); i++; } printf("==%d _1_ sec\n", (GetTickCount() - A2)/1000); ReleaseDC(desktop, hdc); printf("==%d _2_ sec\n", (GetTickCount() - A1)/1000); return 0; } Всем большое спасибо!
Явный пример быдлокода... Вы, случаем, йогой не занимаетесь? Для чего, т.е. цель, использования GetPixel()? Наверняка какой-то скриншот или что-то в этом роде.
mrcrown Это пробник написанный за 3 минуты для теста. Вы бы лучше что-нибудь дельное посоветовали. Держите людей за идиотов?
Приветствую. Насчет скоростей в 7: а проверьте-ка у себя демку из http://rsdn.ru/forum/setup/4084865.1.aspx, - варьируя color scheme (там не GetPixel, а всего лишь FrameRect).
Запустил этот пример кода у себя, только изменил секунды на милисекунды: ==249 _1_ msec ==249 _2_ msec Действительно медленно.