Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/125: Рейтинг темы: голосов - 125, средняя оценка - 4.51
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

GetPixel() работает нереально медленно на Windows 7

17.02.2011, 10:48. Показов 25279. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал программу (бот для онлайн игры), вся его работа заключается в получении цвета пикселя в нужных координатах и совершения тех или иных деййствий в зависимости от полученного цвета. Стояла ХР, все работало прекрасно, но вот решил попробовать семерку и столкнулся с необъяснимой вещью - бот нереально тупит. Например в самом начале он ищет окно игры в браузере (всмысле его координаты) а потом в этом окне находит нужную кнопку по ее цвету:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void find_button(POINT& but,HDC dc){
    HWND desktop=GetDesktopWindow();
    RECT rect;
    GetWindowRect(desktop,&rect);//получаем разрешение экрана
    const COLORREF buttonc=(10142681&0x00FCFCFC);//цвет кнопки, слегка загрубленный, на всякий случай
    but.x=rect.right-30;
    but.y=rect.bottom/2-100;
    while((GetPixel(dc,but.x,but.y)&0x00FCFCFC)==0x00FCFCFC)
        but.x--;//находим окно игры
    but.x-=112;
    bool f=false;
    while(!f){//находим кнопку
        clf=((GetPixel(dc,but.x,but.y))&0x00FCFCFC);
        for(int i=1;i<=10;i++){
            if(clf!=buttonc)
                break;
            else if(i==10)//если 10 пикселей подряд одного цвета, то похоже это кнопка
                f=true;
 
        }
        but.y++;
    }
    SetCursorPos(but.x,but.y+20);
    but.y+=23;
}
слегка быдлокод, т.к. писал "лишь бы работало" )) Но не об этом речь. В общем на ХР все эти действия происходят мнгновенно (для человеческого глаза), а на семерке на это уходит 5-6 секунд. По-моему нереальное время. Пробовал в диспетчере задач менять приоритет процесса - непомогло. Далее вся работа бота сводится к считываню цветов в определенных местах и реагированию на произошедшие события (цвет изменился - значит что-то случилось)), но естественно с такими темпами ни чего не работает. Вот сижу и думаю - почему на Win7 так медленно работают обычные API ?

Добавлено через 9 минут
поечему я решил что тормозит именно GetPixel()? - потому, что больше тут тормозить не чему)
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.02.2011, 10:48
Ответы с готовыми решениями:

Несколько GetPixel с экрана - код работает слишком медленно
Собственно в данный момент я использую этот код. int GetPixel(int X, int Y) { Bitmap bmp = new Bitmap(1, 1,...

Ноутбук начал нереально медленно работать (Acer aspire 5750g)
Поставил на ноутбук windows 10.Ставил через USB-флешку, активировал через kms.Все вроде было отлично.Поставил драйвера Nvidia,поиграл в...

Медленно работает Windows 7
Почему при включении плеера,текстового редактора и инета винда начинает тормозить. Windows 7 AMD 6000+ 2x 3ГГц DDR2 - 2x2048MB GeForce...

67
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
23.07.2011, 19:48
Студворк — интернет-сервис помощи студентам
Ребят, привет, я давно пишу искуственные интеллекты где нужна скорость восприятия данных, и важнейши мпараметром является покадровый запрос обновлений данных с экрана, пускай для локальных задач это не совсем приемлемо, но я хочу быть уверенным в том что когда я буду обрабатывать весь экран со скоростью миллиард операций в миллардную долю секунды я буду максимально уверен, что создам идеальные глаза по восприятию превосходящие человеческие )) ну это все бла бла бла а теперь немного опустимся на землю ...

Вот мой пост недавно размещенный ...

Товарищи приветствую Вас! Помогите с проблемой
Дело в том что, я раньше запрашивал пиксель на экране через:
C++
1
2
3
4
5
6
7
8
9
10
int LOADRGB(int Horz, int Vert)
{
int x;
void *hdc=CreateDCA("DISPLAY",NULL,NULL,NULL);
x = GetPixel(hdc, Horz, Vert);
GLRED = GetRValue(x);
GLGREEN = GetGValue(x);
GLBLUE = GetBValue(x);
DeleteDC(hdc);
}
В Windows XP это ткод работает в разы быстрее чем в Win 7 с чего ? понять мой мозг отказывается, но в семерке он тупит по черному ...

Может быть кто подскажет альтернативный способ запроса данных о пикселе на экране, более быстрый, так как я работаю над созданием простейших ИИ и мне скорость восприятия данных в единицу времени чрезвычайно важна !!

Спасибо за помощь! и Видео для примера ...
http://www.youtube.com/watch?v... 0Isss7XxyA
http://www.youtube.com/watch?v... 3jrKOAEPQ4
http://www.youtube.com/watch?v... AuBRb7TQeI
Другой вариант использования алгоритма третья ссылка ...

И таже самая проблема в икспи работает в 10 раз быстрее чем в семерке, это простая процедура которая обновляет память восприятия данных во всей области экрана, после чего мои программы обрабатывают эту информацию, тоесть я ее вызываю так часто как мне нужно получить новые данные, предвосхищая изменения ... но когда мне унжно максимально быстро их обновлять седьмая винда тупит почерному ... я так понял эта тема как раз ради этого и создана, просто я подписываюсь суда с такой же проблемой, если кому что надо помочь обращайтесь, я как раз решаю эту проблему!!!
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21285 / 8310 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
23.07.2011, 20:05
PaxMaHuHoB, я тебя отослал в эту тему не для того, чтобы ты продублировал здесь свой вопрос, а для того, что ты прочёл, что тут написано. Задавать вопросы в теме, которая давно себя исчерпала - моветон. Не говоря уже о том, что её уже многие читать не станут, т.к. тут все вопросы более менее закрыты
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
23.07.2011, 20:27
Я ее прочитал выяснил все для себя вопросы, был солидарен со всеми участниками обсуждения сообщив о такой же проблеме, оставил свое информационное поле, и готов помочь всем с такой же проблемой ! Разве не для этого форумы созданы ? Я не умею флудить на одну и туже тему бесконечно разными вариантами изложения, фактическая проблема остается и решается, мне здесь помогли и я готов помочь остальным так как запас знаний по многим проблемам написания ботов максимален.
0
 Аватар для VadimTagil
54 / 44 / 11
Регистрация: 15.07.2011
Сообщений: 160
23.07.2011, 23:58
а если из HDC скопировать в другой HDC через BitBlt а уже в том HDC в другом потоке использовать GetPixel? Ведь если GetPixel' ем напрямую вытаскивать из видеокарты каждый пиксель, это длго, а если их вытащть блоком, а анализировать уже в оперативной памяти то быстрее выйдет
1
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
24.07.2011, 00:15
Программирование всегда состоит из двух частей ... 1 это мозговой штурм совмещенный с псевдокодом, на этом этапе можно теоризировать сколько угодно, вплоть то написания драйвера на ассемблере, и то на словах

2. часть это практика при использовании тех инструментов которыми нас снабдили великие предки и умы прошлого, а именно огромное колличество библиотек, которые мы пытаемся использовать не зная от куда ноги растут...

Давайте не будем показывать свою некомпетентность выраЖОВЫВАЯ свои мысли поповоду как бы было бы круто если бы да дакабы, а будем своим братанам давать нужные инструменты для достижения задач, я свои инструменты могу передать любому и знания, часть их находится на kolemag.narod.ru в разделе программирование

А то что виндовс является плохим посредником между программистом и железом это уже давно все знают, и общий язык между этими тремя чуваками найти очень тяжело порой.
0
 Аватар для VadimTagil
54 / 44 / 11
Регистрация: 15.07.2011
Сообщений: 160
24.07.2011, 15:13
ну хорошо вот примерный код...

C++
1
2
3
4
hVirtDC=CreateCompatibleDC(hDC);
hBitmap=CreateCompatibleBitmap(hDC,1000,1000);
SelectObject(hVirtDC,hBitmap);
BitBlt(hVirtDC,hDC,......);//много параметров, все не помню
А в другом потоке код анализа с использованием GetPixel.
Здесь нет никаких фантазий, только реальные вещи
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
24.07.2011, 19:42
Да спасибо большое в другой ветке тоже посоветовал использовать Битмап, сейчас как раз прорабатываю этот момент !

Добавлено через 43 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
COLORREF MyGetPixel(HWND hGame,int x,int y)  
{
        COLORREF pixel;
        BITMAPINFO BMI={0};
        HDC hGDC=GetDC(hGame);
        int Bitp=GetDeviceCaps(hGDC, BITSPIXEL);
        HDC hTmpDC=CreateCompatibleDC(hGDC);
        HBITMAP hTmpBmp=CreateCompatibleBitmap(hGDC,1,1);
        SelectObject(hTmpDC,hTmpBmp);
        BitBlt(hTmpDC,0,0,1,1,hGDC,x,y,SRCCOPY);
        BMI.bmiHeader.biSize = sizeof(BMI.bmiHeader);
        BMI.bmiHeader.biWidth = 1;
        BMI.bmiHeader.biHeight = 1;
        BMI.bmiHeader.biPlanes = 1;
        BMI.bmiHeader.biBitCount = Bitp;
        BMI.bmiHeader.biCompression = BI_RGB;
        BMI.bmiHeader.biSizeImage=Bitp/8;
        BMI.bmiHeader.biClrUsed = 0;
        BMI.bmiHeader.biClrImportant = 0;
        int TMP=GetDIBits(hTmpDC,hTmpBmp,0,1,&pixel,&BMI, DIB_RGB_COLORS);
        pixel&=0xFFFFFF;
        ReleaseDC(hGame,hGDC);
        return pixel;
}
 
int LOADRGB(int Horz, int Vert)
{
    int x;
    x = MyGetPixel("DISPLAY", Horz, Vert);
    cout << "x = " << x << endl;
    GLRED = GetRValue(x);
    GLGREEN = GetGValue(x);
    GLBLUE = GetBValue(x);
}
Что я делаю не так ?? переменная х все время одни и те же выдает значения, хотя при вызове этой LOADRGB на вход поступают разные координаты ...

Добавлено через 46 минут
C++
1
2
3
4
5
6
7
8
9
10
int LOADRGB(int Horz, int Vert)
{
    COLORREF x;
    x = MyGetPixel(HWND_DESKTOP, Horz, Vert);
    cout << "x = " << x << endl;
    cout << "HORZ = " << Horz << "   VERT = " << Vert << endl;
    GLRED = GetRValue(x);
    GLGREEN = GetGValue(x);
    GLBLUE = GetBValue(x);
}

Все вот так вот заработало !!! ВСЕМ СПАСИБО ))

Добавлено через 5 минут
Теперь новая проблема после длительных циклов забивается память до упора и перестает работать загрузка дисплея до этого это решалось через Delete(DC); а тут как это сделать ? Релиз дисплей я так понял не помогает ...

Добавлено через 16 минут
Почему то нельзя заменить ReleaseDC на DeleteDC с релизом работает минуту и все перестает сканировать как буд то память забивается такое было раньше если я не писал ДелетДС, тут такие же симптомы не понимаю почему Релиз не справляется с задачей Делита
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.07.2011, 19:46  [ТС]
PaxMaHuHoB, это ж мой код, я его помню))

Цитата Сообщение от PaxMaHuHoB Посмотреть сообщение
Теперь новая проблема после длительных циклов забивается память до упора и перестает работать загрузка дисплея до этого это решалось через Delete(DC); а тут как это сделать ?
но он слегка косячный:
C++
1
2
3
        HDC hGDC=GetDC(hGame);
        HDC hTmpDC=CreateCompatibleDC(hGDC);
        HBITMAP hTmpBmp=CreateCompatibleBitmap(hGDC,1,1);
нужно:
освободить hGDC,
удалить hTmpBmp,
удалить hTmpDC.

Добавлено через 1 минуту
Цитата Сообщение от PaxMaHuHoB Посмотреть сообщение
Почему то нельзя заменить ReleaseDC на DeleteDC
Какой delete? Это контекст окна, с которым работаешь)
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
24.07.2011, 19:57
Будете долго смеяться наверно над моими пальцевнеботыканиями но решилось все логично как я и думал )))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
COLORREF MyGetPixel(HWND hGame,int x,int y)  //íà âõîäå õýíäë íóæíîãî îêíà è êîîðäèíàòû x,y
{
        COLORREF pixel;
        BITMAPINFO BMI={0};
        HDC hGDC=GetDC(hGame);
        int Bitp=GetDeviceCaps(hGDC, BITSPIXEL);
        HDC hTmpDC=CreateCompatibleDC(hGDC);
        HBITMAP hTmpBmp=CreateCompatibleBitmap(hGDC,1,1);
        SelectObject(hTmpDC,hTmpBmp);
        BitBlt(hTmpDC,0,0,1,1,hGDC,x,y,SRCCOPY);
        BMI.bmiHeader.biSize = sizeof(BMI.bmiHeader);
        BMI.bmiHeader.biWidth = 1;
        BMI.bmiHeader.biHeight = 1;
        BMI.bmiHeader.biPlanes = 1;
        BMI.bmiHeader.biBitCount = Bitp;
        BMI.bmiHeader.biCompression = BI_RGB;
        BMI.bmiHeader.biSizeImage=Bitp/8;
        BMI.bmiHeader.biClrUsed = 0;
        BMI.bmiHeader.biClrImportant = 0;
        int TMP=GetDIBits(hTmpDC,hTmpBmp,0,1,&pixel,&BMI, DIB_RGB_COLORS);
        pixel&=0xFFFFFF;
        ReleaseDC(hGame,hGDC);
        DeleteDC(hTmpDC);
        return pixel;
}
Добавлено через 35 секунд
Кастанеда как оказалось я был прав )) :P
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.07.2011, 20:00  [ТС]
Я ж написал выше, битмап еще удали)

Добавлено через 1 минуту
Цитата Сообщение от PaxMaHuHoB Посмотреть сообщение
Кастанеда как оказалось я был прав ))
Как я понял, ты хотел hGDC удалить.

Добавлено через 53 секунды
Цитата Сообщение от Kastaneda Посмотреть сообщение
битмап еще удали)
DeleteObject(hTmpBmp);
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
24.07.2011, 20:20
вот проклятие я только отсрочил этот глюк он опять вылез я уже выгрузил все что можно !!!!

C++
1
2
3
4
5
      ReleaseDC(hGame,hGDC);
        DeleteDC(hTmpDC);
        DeleteDC(hTmpBmp);
        DeleteDC(hGDC);
        return pixel;
Ну чтож опять не так то ? ))) .... а ща попробую обджект удалить еще мож изза него блин ....
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
24.07.2011, 20:28  [ТС]
C++
1
2
3
        ReleaseDC(hGame,hGDC);
        DeleteObject(hTmpBmp);
        DeleteDC(hTmpDC);
больше ни чего удалять не надо!
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
25.07.2011, 11:43
Ребята Ахтунг !!!! Чисто случайно была обнаружена подмена при конвертации !!!!!!!!
C++
1
2
3
4
5
6
7
8
9
10
int CHECK()
{
 //if ((GLBLUE < 60) && (GLGREEN > 120) && (GLRED > 110))
 if ((GLBLUE > 110) && (GLGREEN > 120) && (GLRED < 60))
       {
        // cout << "YELLOW is HERE    PRESS ANY KEY" << endl;
         CHEKSTATUS = 1;
         //getch();
       }
}

Закомментированный код это прошлый рабочий код условие которого было 100 % верно, после использования Битмапа конвертация происходит с путанницей диапазона, желтый имел условие меньше 60 по блю смещению, теперь же он стал редом, тоесть в бит мапе блю поменялся местами с ред !!!!!!!!!!!!!!!!!!! АХТУНГ как это исправить, почему такой ксосяк ? я вручную изменил ред на блю и все заработало на ура, но это же нонсонс и абсруд !!!

Кто знает как исправить ?

Здесь видео обличает проблему в полной мере !!! Помогите исправить !
http://www.youtube.com/watch?v=LUL-ZXoXZLk
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.07.2011, 11:51  [ТС]
Цитата Сообщение от Evg Посмотреть сообщение
Задавать вопросы в теме, которая давно себя исчерпала - моветон. Не говоря уже о том, что её уже многие читать не станут, т.к. тут все вопросы более менее закрыты
думаю стОит прислушаться)
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
25.07.2011, 12:08
ДА чтож ты такое говоришь ? Многие используют этот код и даже не знают о том что он выдает РГБ с путанницей Красного и синего !

Давайте если уж мы тут обсуждаем этот код доделаем до совершенства и найдем причину неправильной конвертации, если я ее найду первым то естественно я сообщу, код будет доделан и тема автоматически закрыта !!!
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.07.2011, 12:44  [ТС]
По-моему она возвращает как раз RGB, а вот стандартный GetPixel() возвращает с путаницей (BGR). Может причина в этом?
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
25.07.2011, 18:26
Возможно Я тут тесттирую алгоритм и улучшаю его вот первые тесты весьма забавные

http://www.youtube.com/watch?v=1mdqt-D3isk

http://www.youtube.com/watch?v=nDoExKuXSJo
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.07.2011, 20:42  [ТС]
PaxMaHuHoB, посмотрел твое видео "Ошибка при конвертации COLORREF в RGB" (как я понял, оно твое)).
Так переопредели макросы GetRValue, GetGValue, GetRBValue и все)
0
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
25.07.2011, 21:11
Ну как бы это мгновенно что пришло но ум естественно я так и сделал, но факт существования ошибки остался, просто интерессно почему КОЛОРРЕФ путает красный с сними а так все работает уже конечно
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
25.07.2011, 21:17  [ТС]
Цитата Сообщение от PaxMaHuHoB Посмотреть сообщение
просто интерессно почему КОЛОРРЕФ путает красный с сними
Он не путает, просто там расположение цветов RGB счиается с младшего бита, т.е. справа налево)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2011, 21:17

Windows XP медленно работает
Помогите пожалуйста, ситуация следующая...Винда начала глючить, комп не хотел выключаться и я переустановил ее с форматированием. Теперь...

USB работает медленно (Windows 7)
Операционная система: Windows 7 Ultimate x64 (original, RTL, не сборка). Motherboard: ASUS P5QL-CM Драйвера после установки Windows...

Windows XP работает слишком медленно
Добрый день. Есть дома второй компьютер, на нём батя вся в шашки играет) Я не чайник, с 15 лет ставил ХP сам и чем только не...

Медленно работает Аксесс 97 под Windows 7
База работает под Акс97. Кратко алгоритм таков. Открывается связанная таблица как рекордсет. Организуется цикл по записям в ВБА. ...

После переустановки Windows 7 медленно работает система
Здравствуйте! Так случилось что мне доводится часто переустанавливать Windows на ноутбуках разных производителей. И я заметил одну не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru