Аватар для Kastaneda
5232 / 3206 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2

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

17.02.2011, 10:48. Показов 25105. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru