Что нового

[Автоматизация] Интересный глюк с PixelGetColor

vaf

Новичок
Сообщения
174
Репутация
2
Доброй ночи уважаемые форумчане.
Обнаружил интересный глюк с PixelGetColor. Написал я бота, который считывает цвета с экрана. Для этого я использовал PixelGetColor (у меня Windows 7)
На считывание примерно 200 точек в цикле уходит с десяток секунд, что очень долго, но пришлось мириться. Бот пусть медленно, но работу свою делал. Бот работает круглосуточно, и вот я решил его проконтролировать, подключившись удаленно к рабочему столу программой Remote Administrator.
И о чудо PixelGetColor стал отрабатывать то же самое за доли секунд. Напрашивается вопрос. Значит это как то фиксится ? А как ? Что за режим включился ?
 

joiner

Модератор
Локальный модератор
Сообщения
3,426
Репутация
597
нужно видеть код. а лирические беседы никак не помогут разгадать - какова же логика построения вашего кода
к тому же, долгая работа может быть связана с тем, что точки не найдены
 
Автор
V

vaf

Новичок
Сообщения
174
Репутация
2
joiner сказал(а):
нужно видеть код. а лирические беседы никак не помогут разгадать - какова же логика построения вашего кода
к тому же, долгая работа может быть связана с тем, что точки не найдены

У меня функция определяющая, есть ли в заданном промежутке цвет 00F?F?F?. Промежуток обычно не более 200 пикселей (редко до 400)
ps($x, $y) я вызываю в цикле, если ps($x, $y) возвращает "1". то цикл принудительно завершаю. Цикл небольшой всего 200 итераций.
Ниже код функции. В общем то элементарные действия, но занимают очень много времени.
Да, я читал что PixelGetColor тормозная, но когда я удаленно подключился к рабочему столу, то все это заработало раз в 100 быстрее.

P.S. Пробовал включить упрощенный режим, т.е. отключить Aero Glass, проблема не разрешилась, хотя когда подключаюсь удаленно, Windows выводит сообщение, что включен упрощенный режим.

Код:
Func ps($x, $y) ; Функция поиска цвета 00F?F?F? в координате $x, $y. 1-есть цвет, 0-нет
   $CurrentColor = Hex (PixelGetColor ($x, $y))
   $ctemp = StringMid ($CurrentColor, 3, 1) & StringMid ($CurrentColor, 5, 1) & StringMid ($CurrentColor, 7, 1) ; Извлекаем 3,5,7й символ из строки
   If $ctemp = "FFF" Then ; Если это символы FFF, значит цвет белый
	  Return 1
   Else
	  Return 0
   EndIf
EndFunc
 

joiner

Модератор
Локальный модератор
Сообщения
3,426
Репутация
597
покажите построение цикла вызова.
у меня цикл из 400 вызовов функции занял в среднем 2.5 сек
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Аналогично, если скомпилировать скрипт, и выставить совместимость, что бы отключалось "композиция рабочего стола" то скорость возрастает в 540 раз


Добавлено:
Сообщение автоматически объединено:

Автор, ты можешь вписать в начало скрипта:
Код:
#include <WinAPIGdi.au3>
_WinAPI_DwmEnableComposition ( False )


что бы ее отключать.
 

InnI

AutoIT Гуру
Сообщения
4,613
Репутация
1,299
vaf [?]
отключить Aero Glass, проблема не разрешилась
Эксперимент
Код:
$t = TimerInit()
For $i = 0 To 300
  ps($i, $i)
Next
ConsoleWrite(TimerDiff($t) & @CRLF)

Func ps($x, $y) ; Функция поиска цвета 00F?F?F? в координате $x, $y. 1-есть цвет, 0-нет
   $CurrentColor = Hex (PixelGetColor ($x, $y))
   $ctemp = StringMid ($CurrentColor, 3, 1) & StringMid ($CurrentColor, 5, 1) & StringMid ($CurrentColor, 7, 1) ; Извлекаем 3,5,7й символ из строки
   If $ctemp = "FFF" Then ; Если это символы FFF, значит цвет белый
      Return 1
   Else
      Return 0
   EndIf
EndFunc
Выбрана тема "Windows 7" из "Темы Aero" :
- если окно IE10 не свёрнуто : 10007.2229965894
- при свёрнутом окне IE : 5558.24228549583
Выбрана тема "Windows 7 - упрощенный стиль" из "Базовые (упрощенные) темы и..." : 5.58057549203678 (от состояния окна IE не зависит).
 
Автор
V

vaf

Новичок
Сообщения
174
Репутация
2
joiner сказал(а):
покажите построение цикла вызова.
у меня цикл из 400 вызовов функции занял в среднем 2.5 сек

Цикл вызывается вот отсюда, смысл этой конструкции следующий. Если нужные цвета нам попадаются, то их координаты пишутся во временную переменную, если не попадаются, то к reset_counter прибавляется 1. Если 40 раз цвета не попадаются то из цикла выходим.
Но вопрос в другом. Это тормозит именно на Windows 7 и то, когда я подключаюсь удаленно к рабочему столу, тормоза пропадают.
Как бы решить баг с тормозами ? Может быть есть какой то режим работы видеокарточки ? или нужно в Windows 7 нужно что то отключить ? На XP таких проблем нет, там тоже скрипт отрабатывается быстро.

Код:
$ctemp = ""
   $reset_counter = 0
   For $xc=800 To 1200
	  If ps($xc,800) = 1 Then
		 $ctemp = $ctemp & $xc
		 $reset_counter = 0
	  Else
		 $reset_counter += 1
	  EndIf
	  If $reset_counter >= 40 Then ExitLoop
   Next
 
Автор
V

vaf

Новичок
Сообщения
174
Репутация
2
InnI сказал(а):
vaf [?]
отключить Aero Glass, проблема не разрешилась
Эксперимент
Код:
$t = TimerInit()
For $i = 0 To 300
  ps($i, $i)
Next
ConsoleWrite(TimerDiff($t) & @CRLF)

Func ps($x, $y) ; Функция поиска цвета 00F?F?F? в координате $x, $y. 1-есть цвет, 0-нет
   $CurrentColor = Hex (PixelGetColor ($x, $y))
   $ctemp = StringMid ($CurrentColor, 3, 1) & StringMid ($CurrentColor, 5, 1) & StringMid ($CurrentColor, 7, 1) ; Извлекаем 3,5,7й символ из строки
   If $ctemp = "FFF" Then ; Если это символы FFF, значит цвет белый
      Return 1
   Else
      Return 0
   EndIf
EndFunc
Выбрана тема "Windows 7" из "Темы Aero" :
- если окно IE10 не свёрнуто : 10007.2229965894
- при свёрнутом окне IE : 5558.24228549583
Выбрана тема "Windows 7 - упрощенный стиль" из "Базовые (упрощенные) темы и..." : 5.58057549203678 (от состояния окна IE не зависит).
Так вам удалось избавиться от тормозов, включив "Windows 7 - упрощенный стиль" из "Базовые (упрощенные) темы ?
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,603
Репутация
941
А еще есть такая штука как FastFind. Скорость скрипта, если мне память не изменяет, когда я со встроенных функций перешел на FastFind, возросла в несколько миллионов раз. PGC чтобы получить цвет, каждый раз выполняет ряд функций аля "узнать хендл монитора, захватить хендл монитора, [узнать цвет пикселя], убить хендл монитора, забыть хендл монитора". Из этих 5 действий нам нужно только одно. 4 действия - работа в пустую. И так в каждом пиксель гет калоре. Даже если не использовать FF, а работать напрямую с винапи или гди, вы можете оптимизировать задачу так, что вы один раз узнаете и открываете хендл, далее проводите весь необходимый ряд распознаваний и получения цветов, и только потом закрываете хендл. В данном случае при например определении цвета 10 точек, фактически вы совершите 14 операций а не 50
 
Автор
V

vaf

Новичок
Сообщения
174
Репутация
2
inververs сказал(а):
Аналогично, если скомпилировать скрипт, и выставить совместимость, что бы отключалось "композиция рабочего стола" то скорость возрастает в 540 раз


Добавлено:
Сообщение автоматически объединено:

Автор, ты можешь вписать в начало скрипта:
Код:
#include <WinAPIGdi.au3>
_WinAPI_DwmEnableComposition ( False )


что бы ее отключать.




Когда прописываю в начале, выдает вот что.
C:\Program Files\AutoIt3\Include\WinAPIGdi.au3 (25) : ==> Variable used without being declared.:
Global Const $tagDIBSECTION = $tagBITMAP & ';' & $tagBITMAPINFOHEADER & ';dword dsBitfields[3];ptr dshSection;dword dsOffset'
Global Const $tagDIBSECTION = $tagBITMAP & ';' & ^ ERROR
 

InnI

AutoIT Гуру
Сообщения
4,613
Репутация
1,299
OffTopic:
vaf [?]
Определитесь уже с версией AutoIt (несколько тем с одинаковыми проблемами). Установите последнюю 3.3.12.0, как указано в вашем профиле.
 
Автор
V

vaf

Новичок
Сообщения
174
Репутация
2
inververs сказал(а):
Аналогично, если скомпилировать скрипт, и выставить совместимость, что бы отключалось "композиция рабочего стола" то скорость возрастает в 540 раз


Добавлено:
Сообщение автоматически объединено:

Автор, ты можешь вписать в начало скрипта:
Код:
#include <WinAPIGdi.au3>
_WinAPI_DwmEnableComposition ( False )


что бы ее отключать.



Вы гений, очень помогло. Я давно с этим мучаюсь.
InnI спасибо за помощь, навели на мысль.
Всем спасибо, проблема решена.
 

SyDr

Сидра
Сообщения
651
Репутация
158
А вот вариант без отключения композиции:
http://autoit-script.ru/index.php?topic=3943.msg29329#msg29329
 
Верх