Что нового

[Автоматизация] Медленная работа скрипта на Windows 8 (64bit)

vaf

Новичок
Сообщения
186
Репутация
2
Добрый день уважаемые форумчане, есть скрипт поиска определенных объектов на экране через PixelSearch, на WinXP все работает отлично, на Windows 7 (32 bit) тоже все нормально, стоит запустить на Windows 8 (64bit) работает раз в 100 медленнее. В чем может быть причина ?
Скрипт ниже. Чтобы было более понятно что он делает, ниже ссылка на архив скрипта, внутри несколько анализируемых файлов.
http://yadi.sk/d/hQRw5UuPHoKQm
Буду благодарен за подсказки, а то из за этого приходится все делать на 2х компьютерах. формирование скриншотов на одном, анализ на другом, а так все бы на одном делалось.
P.S. для работы сделайте файлик 1-1-1.jpg и поместите его в корень диска C: :smile:


Код:
; Анализ скриншотов и формирование файла планет на которых есть обломки
#include <ScreenCapture.au3>
#include <GDIP.au3>
#include <Array.au3>

HotKeySet("{ESC}", "Terminate")

$Form1 = GUICreate("Скрины", 552, 641)
$Pic1 = GUICtrlCreatePic("c:\1-1-1.jpg", 0, 0, 552, 641)
GUISetState()
$xn = WinGetPos ("Скрины")

$file = FileOpen ("gala.csv", 0)

; Check if file opened for reading OK
If $File = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

While 1
    $line = FileReadLine($File)
    If @error = -1 Then ExitLoop
    $coord = StringSplit ($line,";") ; coord[1] - Galaxy; coord[2] - System; coord[3] - Planet
	GUICtrlSetImage($Pic1, $coord[1] & "-" & $coord[2] & "-" & $coord[3] & ".jpg") ; Вывели картинку

; Координаты области в которой производится поиск
$x1 = $xn[0]+5 + 35 ; 41 это чтобы он не искал за пределами экрана
$y1 = $xn[1] + 35 ; + 30 это отступ сверху
$x2 = $xn[0]+$xn[2] - 5 - 35
$y2 = $xn[1]+$xn[3] - 5 - 35
$xt = $x1
$yt = $y1
$ssp = 3
; ------------------------------------------------

_GDIPlus_Startup()
$hBitmap  = _GDIPlus_BitmapCreateFromScan0 ( $x2-$x1, $y2-$y1 )

While 1
   $pixel = PixelSearch ( $x1, $y1, $x2, $y1, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF

   If @error Then ;Если пиксель не найден по всему X
	  $y1 = $y1 + $ssp ; Будем сканить через строку, чтобы быстрее
	  $x1 = $xt
   Else
	  If @error = 0 Then ; ----------------------- Если пиксель найден, то дальше будем смотреть есть ли пиксели по опорным точкам.
		 ;MouseMove ($pixel[0], $pixel[1])
		 $pz = 0

			$pt = PixelSearch ( $pixel[0] - 13, $pixel[1] + 21, $pixel[0] - 13, $pixel[1] + 21, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
			If @error = 0 Then
			   ;MouseMove ($pixel[0] - 22, $pixel[1] + 24)
			   $pz += 1
			EndIf

			$pt = PixelSearch ( $pixel[0] - 3, $pixel[1] + 33, $pixel[0] - 3, $pixel[1] + 33, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
			If @error = 0 Then
			   ;MouseMove ($pixel[0] - 23, $pixel[1] + 24)
			   $pz += 1
			EndIf

			$pt = PixelSearch ( $pixel[0] + 18, $pixel[1] + 0, $pixel[0] + 18, $pixel[1] + 0, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
			If @error = 0 Then
			   ;MouseMove ($pixel[0] - 21, $pixel[1] + 24)
			   $pz += 1
			EndIf

			$pt = PixelSearch ( $pixel[0] + 29, $pixel[1] + 18, $pixel[0] + 29, $pixel[1] + 18, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
			If @error = 0 Then
			   ;MouseMove ($pixel[0] + 14, $pixel[1] + 24)
			   $pz += 1
			EndIf

			$pt = PixelSearch ( $pixel[0] + 26, $pixel[1] + 30, $pixel[0] + 26, $pixel[1] + 30, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
			If @error = 0 Then
			   ;MouseMove ($pixel[0] + 15, $pixel[1] + 24)
			   $pz += 1
			EndIf

			$pt = PixelSearch ( $pixel[0] + 23, $pixel[1] + 33, $pixel[0] + 23, $pixel[1] + 33, 0xFFFFFF, 15) ; Ищем цвет 0xFFFFFF
			If @error = 0 Then
			   ;MouseMove ($pixel[0] + 13, $pixel[1] + 24)
			   $pz += 1
			EndIf

 		 If $pz = 6 Then ; Если все точки совпали, записываем в файлик
			FileWriteLine ("move.bat", "move /Y " & $coord[1] & "-" & $coord[2] & "-" & $coord[3] & ".jpg, Planet/")
			$y1 = $y2
		 EndIf
		 $pz = 0

#comments-start	  
#comments-end
;		 _GDIPlus_BitmapSetPixel ( $hBitmap, $pixel[0]-$xt, $pixel[1]-$yt, 0xFF0007ff  )
	  EndIf
	  $x1 = $pixel[0] ; координата X, будет X найденного пиксела, чтобы не терять время
	  $x1 = $x1 + 1
   EndIf

   If $x1 >= $x2 Then
	  $x1 = $xt
	  $y1 = $y1 + $ssp ; Будем сканить через строку, чтобы быстрее
   Endif
   ;ToolTip ($x1 & " " &$y1, 0, 0)
   If $y1 >= $y2 Then
	  ExitLoop
   EndIf
WEnd

;_GDIPlus_ImageSaveToFile($hBitmap, "png/" & $coord[1] & "-" & $coord[2] & "-" & $coord[3] & ".png") ;save bitmap to disk
;_GDIPlus_Shutdown()

Wend

FileClose($file)

Func Terminate()
	Exit 0
 EndFunc
 

beliy

Продвинутый
Сообщения
372
Репутация
72
Как вариант, пробовали компилировать как 64-битное приложение?
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Может, Windows 8 UAC блокирует обращение к корню диска C?
 
Автор
V

vaf

Новичок
Сообщения
186
Репутация
2
Как 64bit пробовал, по поводу блокировки обращения к диску C: скрипт работает, но работает медленно. я вставлял tooltips, чтобы смотреть какие координаты "просматриваются" скриптом, процесс идет но медленно.
А может быть что это из за Aero ?
 

sandrose

Новичок
Сообщения
2
Репутация
0
На Win7 64-bit была такая же проблема, отключил Aero темы и все заработало!
 
Верх