Форум программистов, компьютерный форум, киберфорум
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. Показов 25076. Ответов 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
26.07.2011, 12:45
Студворк — интернет-сервис помощи студентам
Ах ты епрст теперь ясно )) Спасибо ребята ... вобщем тут уже во всю идет доработка алгоритма он уже такое творит ппц просто )) Художник прямо таки


Не по теме:

Добавлено через 2 часа 5 минут
http://vkontakte.ru/photo3239111_265768504

Добавлено через 9 часов 58 минут
Дорабатываю алгоритм поиска пути ... вот что уже умеем

http://www.youtube.com/watch?v=ebpPFsKOWWQ

0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
28.07.2011, 12:03
PaxMaHuHoB, Прекращаем оффтоп. Создавать новые темы не возбраняется.
0
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 3
05.02.2012, 16:49
Здравствуйте
Я почитал тему и попытался сделать пример сканирование жизни моба в игре, но на win 7 сильно медленно сканирует, а на win XP мгновенно. И я никак не могу определить что я не так сделал. Прошу помочь. Заранее спасибо.
Вот пример кода:
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
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;
}
Сам алгоритм сканирования жизни моба:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
                 konec=xx1;
                 liney=yy;
                 for (nachalo = xx; nachalo < konec; nachalo++)
                 {
                 COLORREF x;
                 x = MyGetPixel(HWND_DESKTOP, nachalo, liney);
                 GLRED = GetRValue(x);
                 
                   SetCursorPos(nachalo, liney);
                   if (GLRED < 100)
                   {
 
                      Label10->Caption=IntToStr(nachalo);
                      break;
                   }
                 }
                }
Вот как он работает на win7: http://www.youtube.com/watch?v=47gTN0LNN68
0
 Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
05.02.2012, 16:53  [ТС]
C++
1
x = MyGetPixel(HWND_DESKTOP, nachalo, liney);
передавай хендл окна, а не хендл рабочего стола. Это значительно ускорит сканирование.
0
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 3
06.02.2012, 17:31
Я изменил хендл , но скорость сканирования не изменилась(.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    {
                 HWND h = FindWindow(NULL,"Project2");
                 konec=xx1;
                 liney=yy;
                 for (nachalo = xx; nachalo < konec; nachalo++)
                 {
                 COLORREF x;
                 x = MyGetPixel(h, nachalo, liney);
                 GLRED = GetRValue(x);
                   SetCursorPos(nachalo, liney);
                   if (GLRED < 100)
                   {
 
                      Label10->Caption=IntToStr(nachalo);
                      break;
                   }
                 }
                }
Добавлено через 21 час 32 минуты
Я реализовал сканирование другим способом(где вызов getpixel гораздо меньше).
0
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 445
07.02.2012, 08:10
Это связано с графическим оформлением системы, поставьте стандартный, который такой невзрачный.
0
 Аватар для VadimTagil
54 / 44 / 11
Регистрация: 15.07.2011
Сообщений: 160
08.02.2012, 11:51
Цитата Сообщение от Micro Посмотреть сообщение
Это связано с графическим оформлением системы, поставьте стандартный, который такой невзрачный.
вряд ли в этом дело. Скорее это зависит от драйвера видеокарты
0
1 / 1 / 0
Регистрация: 06.12.2013
Сообщений: 76
20.01.2017, 09:10
тема супер помогло реально хоть и старая) всем спасибо кто принимал в этом участие
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.01.2017, 09:10

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 на ноутбуках разных производителей. И я заметил одну не...


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

Или воспользуйтесь поиском по форуму:
68
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru