Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.86/92: Рейтинг темы: голосов - 92, средняя оценка - 4.86
Kastaneda
Jesus loves me
Эксперт С++
4763 / 2966 / 342
Регистрация: 12.12.2009
Сообщений: 7,531
Записей в блоге: 2
Завершенные тесты: 1
#1

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

17.02.2011, 10:48. Просмотров 16632. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2011, 10:48
Ответы с готовыми решениями:

DrawImage() работает очень медленно
Передо мной стоит такая задача: в память программы загружены картинки (слои),...

GetPixel
#include &lt;iostream&gt; #include &lt;windows.h&gt; #include &lt;stdlib.h&gt; #include...

GetPixel(), BitMap()
Всем привет! Столкнулся с проблемой, что &quot;GetPixel()&quot; работает медленно на...

GetPixel() и SetWindowText()
Здравствуйте. Например во Flash и Javascript есть инструменты(функции) для...

GetPixel неправильно определяет цвет пикселя
Господа такая ситуация - я нарисовал в своём окне линию красного цвета , затем...

67
PaxMaHuHoB
3 / 3 / 0
Регистрация: 23.07.2011
Сообщений: 50
26.07.2011, 12:45 #61
Ах ты епрст теперь ясно )) Спасибо ребята ... вобщем тут уже во всю идет доработка алгоритма он уже такое творит ппц просто )) Художник прямо таки


Не по теме:

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

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

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

0
insideone
Модератор
Автор FAQ
3657 / 937 / 112
Регистрация: 10.01.2010
Сообщений: 2,516
28.07.2011, 12:03 #62
PaxMaHuHoB, Прекращаем оффтоп. Создавать новые темы не возбраняется.
0
megadan
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 3
05.02.2012, 16:49 #63
Здравствуйте
Я почитал тему и попытался сделать пример сканирование жизни моба в игре, но на 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
Jesus loves me
Эксперт С++
4763 / 2966 / 342
Регистрация: 12.12.2009
Сообщений: 7,531
Записей в блоге: 2
Завершенные тесты: 1
05.02.2012, 16:53  [ТС] #64
C++
1
x = MyGetPixel(HWND_DESKTOP, nachalo, liney);
передавай хендл окна, а не хендл рабочего стола. Это значительно ускорит сканирование.
0
megadan
0 / 0 / 0
Регистрация: 05.02.2012
Сообщений: 3
06.02.2012, 17:31 #65
Я изменил хендл , но скорость сканирования не изменилась(.
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
Micro
43 / 43 / 5
Регистрация: 12.11.2011
Сообщений: 435
07.02.2012, 08:10 #66
Это связано с графическим оформлением системы, поставьте стандартный, который такой невзрачный.
0
VadimTagil
14 / 14 / 1
Регистрация: 15.07.2011
Сообщений: 81
08.02.2012, 11:51 #67
Цитата Сообщение от Micro Посмотреть сообщение
Это связано с графическим оформлением системы, поставьте стандартный, который такой невзрачный.
вряд ли в этом дело. Скорее это зависит от драйвера видеокарты
0
fcnfgtyrjd3004
1 / 1 / 0
Регистрация: 06.12.2013
Сообщений: 76
20.01.2017, 09:10 #68
тема супер помогло реально хоть и старая) всем спасибо кто принимал в этом участие
0
20.01.2017, 09:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2017, 09:10

Функция GetPixel, не понимаю систему координат
Есть код который определяет в окне линию определенного цвета но я не могу...

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

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


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

Или воспользуйтесь поиском по форуму:
68
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru