Что нового

Почему программа в win8 работает гораздо медленнее чем в win7?

Tapok

Новичок
Сообщения
204
Репутация
0
Почему программа в win8 работает гораздо медленнее чем в win7?
На win7 (32 bit) выполняется почти в два раза быстрее, чем на win8 (64 bit), причем комп с win8 гораздо мощнее. В чем причина и как попытаться исправить? Может какие-то службы отключить?

Программа связана с поиском изображений, цветов точек, многократно используется PixelGetColor.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Tapok [?]
...В чем причина и как попытаться исправить?...

...многократно используется PixelGetColor.
Лучше сделать скрин и искать пиксели в нем. Будет быстрее.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Скрин в буфер? И как будет выглядеть тогда определение RGB точки с координатами x,y?
Что будет вместо
Код:
Func color ($x, $y)
	Local $iColor = PixelGetColor($x , $y)
	$hex = Hex($iColor, 6)
	$HR = StringMid($hex, 1, 2)
	$HG = StringMid($hex, 3, 2)
	$HB = StringMid($hex, 5, 2)
	$R = Dec($HR)
	$G = Dec($HG)
	$B = Dec($HB)
        ...
EndFunc


Впечатлила фраза Yashied
API быстрее PixelGetColor() в 7.5 тысяч (!) раз

Тогда так вопрос поставлю: как с помощью API на скрине экрана работать с цветами RGB точек с координатами x,y (по аналогии с PixelGetColor($x , $y))?
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Можно сделать с помощью например этой библиотеки. http://autoit-script.ru/index.php?topic=19590.msg120992#msg120992
Функцией ScreenToBuff создается скрин и помещается в буфер и после этого используя функцию GetPixel_Buff можно получить цвет пикселя и требуемых координатах.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Tapok

1)
Разная скорость, возможно, потому, что разные темы стоят.
В любом случае, сравнивать разные системы на разном железе просто так нельзя.

2)
Как и пишет Prog, надо использовать другой инструмент, и лучше всего dll на компилируемом языке

3)
Использовать поиск по форуму.

OffTopic:

Почему нужно использовать поиск? Да, собственно, даже поиск не нужен... Потому, что за 5 лет, пока я здесь зареген, не было недели, наверно, когда бы не поднимался вопрос о поиске цвета на экране и медленной скорости. Достаточно открыть любой раздел (а вообще есть раздел про боты, но люди пишут куда угодно), просмотреть пару страниц - и вылезет куча решений и отсылок. Но нет, люди продолжают регистрироваться и задавать одни и те же вопросы, получать одни и те же ответы, и так далее...
За 2 недели только у меня 3 раза спросили про поиск картинки в картинке, при этом ни один из спрашивающих, как я понял, не видел вопросов и ответов другого)
Меня пугает отсутствие у новичков навыков работы с информацией...
Да, у меня, как сейчас модно писать, что-то как-то "пригорело" от этой темы)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Библиотека FastFind
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Prog сказал(а):
Можно сделать с помощью например этой библиотеки. http://autoit-script.ru/index.php?topic=19590.msg120992#msg120992
Функцией ScreenToBuff создается скрин и помещается в буфер и после этого используя функцию GetPixel_Buff можно получить цвет пикселя и требуемых координатах.
А можно пример кода, использующего функцию "ScreenToBuff" и выдающего в консоль RGB точек 100,100 и 200,200 ? :-[
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Код:
$dll=DllOpen("FindPixel.dll")

; Скрин с координатами 100, 100 и шириной, высторой 100, 100.
; ScreenToBuff(x, y, Width, Height, hWnd)
$Ret=DllCall($dll, "int", "ScreenToBuff", "int",  100, "int",  100, "int",  100, "int",  100, "int", 0)
if $Ret[0]<>0 then
   ; GetPixel_Buff(x, y)
   $Ret=DllCall($dll, "int", "GetPixel_Buff", "int",  0, "int",  0) ; Точка по коордитане 100, 100.
   ConsoleWrite("Color 1 " & $Ret[0] & @CRLF)
   ; GetPixel_Buff(x, y)
   $Ret=DllCall($dll, "int", "GetPixel_Buff", "int",  99, "int", 99) ; Точка по коордитане 200, 200.
   ConsoleWrite("Color 2 " & $Ret[0] & @CRLF)
Else
   ConsoleWrite("Error!" & @CRLF)
endif
DllClose($dll)
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Prog, полученный результат:
Код:
Color 1 13735235
Color 2 13735235
Это цвета в чем? :blink:
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Это цвета до разделения на цветовые составляющие. Формат тот же что у PixelGetColor.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Prog, спасибо!

А почему выдает ошибку, когда пытаюсь определить цвета всех точек в квадрате 100 на 100?

Код:
$timer = TimerInit()

$dll=DllOpen("FindPixel.dll")
$Ret=DllCall($dll, "int", "ScreenToBuff", "int",  0, "int",  0, "int",  1280, "int",  1024, "int", 0)

for $i=1 to 10 Step 1
	for $j=1 to 10 Step 1
		if $Ret[0]<>0 then
			$Ret=DllCall($dll, "int", "GetPixel_Buff", "int",  $i, "int",  $j) ; Точка по координате $i, $j.
			$hex = Hex($Ret[0], 6)
			$HB = StringMid($hex, 1, 2)
			$HG = StringMid($hex, 3, 2)
			$HR = StringMid($hex, 5, 2)
			$R = Dec($HR)
			$G = Dec($HG)
			$B = Dec($HB)
			ConsoleWrite(@CRLF&$R&" , "&$G&" , "&$B&@CRLF&@CRLF)
		Else
			ConsoleWrite("Error!" & @CRLF)
		endif
	Next
Next

DllClose($dll)

ConsoleWrite(@CRLF&Round(Ceiling(TimerDiff($timer))/1000, 1) &" сек."&@CRLF&@CRLF)
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Какую ошибку? Несколько раз запускал и никаких сообщений об ошибках не было.
 
Автор
T

Tapok

Новичок
Сообщения
204
Репутация
0
Начиная с i=2 начинаем заходить в ветку с сообщением "error"
 

Prog

Продвинутый
Сообщения
537
Репутация
65
А так.
Код:
$timer = TimerInit()

$dll=DllOpen("FindPixel.dll")
$Ret=DllCall($dll, "int", "ScreenToBuff", "int",  0, "int",  0, "int",  1280, "int",  1024, "int", 0)

for $i=1 to 10 Step 1
    for $j=1 to 10 Step 1
            $Ret=DllCall($dll, "int", "GetPixel_Buff", "int",  $i, "int",  $j) ; Точка по координате $i, $j.
            $hex = Hex($Ret[0], 6)
            $HB = StringMid($hex, 1, 2)
            $HG = StringMid($hex, 3, 2)
            $HR = StringMid($hex, 5, 2)
            $R = Dec($HR)
            $G = Dec($HG)
            $B = Dec($HB)
            ConsoleWrite(@CRLF&$R&" , "&$G&" , "&$B&@CRLF&@CRLF)
    Next
Next

DllClose($dll)

ConsoleWrite(@CRLF&Round(Ceiling(TimerDiff($timer))/1000, 1) &" сек."&@CRLF&@CRLF)
 
Верх