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

Тема в разделе "WASM.WIN32", создана пользователем Mortarion, 18 фев 2011.

  1. Mortarion

    Mortarion New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    12
    Написал программу, вся её работа заключается в получении цвета пикселя в нужных координатах и совершения тех или иных деййствий в зависимости от полученного цвета. Стояла ХР, все работало прекрасно, но вот решил попробовать семерку и столкнулся с необъяснимой вещью - программка нереально тупит.
    К примеру:
    Код (Text):
    1. for(int i=0;i<1000;i++)
    2.    GetPixel(bla,bla,bla);
    Такой код выполняется порядка 30 секунд. А единичный вызов приводит к задержке в несколько секунд
    Почему на Windows 7 так медленно работает эта API функция? И можно ли её заменить?
     
  2. dyn

    dyn New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2009
    Сообщения:
    566
    Медленно работает в отладчике или без?
    Уточни плз
     
  3. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    В gdiplus не рекомендуют злоупотреблять GetPixel.
    Вопрос обсуждался на RSDN.ru
     
  4. Mortarion

    Mortarion New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    12
    И в отладчике и без работает медленно.
     
  5. Mortarion

    Mortarion New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    12
    Речь так же идет и об одиночном вызове GetPixel(), он тоже тормозит.
     
  6. Naruto

    Naruto New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2010
    Сообщения:
    28
    Есть функция bitblt если интересно то выше в теме: "покерный бот" есть код, если есть вопросы там же и спроси
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не используй GetPixel, получи сразу нужную область через GetDIBits, а потом обрабатывай.
    Совершать тыщу вызовов гетпиксел - ну бред же, согласись)
     
  8. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    Тестовый сорс в студию. Сделать такую задержку для единичного вызова невозможно как неоптимально ни делай.
    Все указывает на глючный антивирус\троян\вирус\софт удаленного рабочего стола\глючный видео драйвер\багу в твоей проге. Кто тебя знает, может у тебя там уже давно экран перехватывается и в сеть шлется.
     
  9. Mortarion

    Mortarion New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    12
    Вот такой код, протестирован на Win7 выполняется порядка 2 секунд
    Код (Text):
    1. HDC hdc=GetDC(0);
    2. GetPixel(hdc,but.x,but.y)
    Проблема заключалась в том, что если получать пиксель используя хэдл рабочего стола (или контекст ус-ва, связанный с раб. столом, то ф-ция тормозит, если использовать например хэндл браузера, то ф-ция работают нормально.
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    А мерил время выполнения как?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    хендл браузера это как? приведи пример когда работает нормально с теми же GetDC/GetPixel
    кажется, я догадываюсь в чем причина твоих тормозов.
     
  12. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    диагноз в студию, пажалста
     
  13. Mortarion

    Mortarion New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    12
    Ничего не понимаю 2 недели назад такой код выполнялся около 7 секунд, сегодня проверил практически моментально, мистика!
    Код (Text):
    1. int main(){
    2.     DWORD A1, A2;
    3.  
    4.     A1 = GetTickCount();
    5.     COLORREF clf;
    6.  
    7.     HWND desktop=GetDesktopWindow();
    8.     RECT rect;
    9.     GetWindowRect(desktop,&rect);//получаем разрешение экрана
    10.     int x=300;
    11.     int y=300;
    12.    
    13.     HDC hdc=GetDC(0);
    14.  
    15.     A2 = GetTickCount();
    16.     for (int i = 0; i < 25; i++){
    17.     clf = GetPixel(hdc,x,y);
    18.     i++;
    19.     }
    20.     printf("==%d _1_ sec\n", (GetTickCount() - A2)/1000);
    21.  
    22.     ReleaseDC(desktop, hdc);
    23.    
    24.     printf("==%d _2_ sec\n", (GetTickCount() - A1)/1000);
    25.     return 0;
    26. }
    Всем большое спасибо!
     
  14. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Явный пример быдлокода... Вы, случаем, йогой не занимаетесь?
    Для чего, т.е. цель, использования GetPixel()? Наверняка какой-то скриншот или что-то в этом роде.
     
  15. Mortarion

    Mortarion New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2009
    Сообщения:
    12
    mrcrown
    Это пробник написанный за 3 минуты для теста.
    Вы бы лучше что-нибудь дельное посоветовали.
    Держите людей за идиотов?
     
  16. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Приветствую.
    Насчет скоростей в 7:
    а проверьте-ка у себя демку из http://rsdn.ru/forum/setup/4084865.1.aspx, - варьируя color scheme
    (там не GetPixel, а всего лишь FrameRect).
     
  17. mrcrown

    mrcrown Member

    Публикаций:
    0
    Регистрация:
    18 янв 2008
    Сообщения:
    227
    Никого ни за что не держу, вы сами себя держите.
     
  18. semen

    semen New Member

    Публикаций:
    0
    Регистрация:
    8 июн 2004
    Сообщения:
    334
    Адрес:
    Russia
    Запустил этот пример кода у себя, только изменил секунды на милисекунды:
    ==249 _1_ msec
    ==249 _2_ msec
    Действительно медленно.