Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

PixelGetColor Geschwindigkeit



  • Please log in to reply
9 replies to this topic
Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013

Hallo,

 

ich habe Festgestellt, dass die Ausführungszeit von PixelGetColor erheblich abweicht,

abhängig davon ob der Befehl auf dem selben PC direkt ausgeführt wird oder ob via Remote Desktop Sitzung gearbeitet wird.

Selbes Ahk-Skript selber PC selbe AHK-Exe ... die Ausführung via Standart -RDP von Win7 ist mehr als 10 mal so schnell.

Mein Erklärungsversuch: via RDP werden irgendwelche vereinfachte Bildaufbau-Rutinen verwendet, die es auch AHK einfacher machen die Pixelfarbe auszulesen.

 

Nun zu meiner Frage:

Kennt jemand Einstellungen die man durchführen kann, das man auch an der Host-Konsole direkt sitzend, in den Genuss der hohen Abarbeitungsgeschwindigkeit kommt?

Bzw. gibt es schnellere Alternativen (z.B. DLLs)?

 

Hintergrund:

Ich benötige die Pixel-Farben um daraus Schwarz/Weis-Monochrom Felder zu berechnen, die für eine einfache Schrifterkennung rein mit AHK-Mitteln dienen.

Das Ganze funktioniert auch zufriedenstellend via RDP, direkt an der Konsole wird jedoch stark die Geduld des Anwenders gepüft.

 

Gerdi



jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
Auszug aus AutoHotkey Source (script_autoit.cpp - Stammt noch aus AutoIt Zeiten)
ResultType Line::PixelGetColor(int aX, int aY, LPTSTR aOptions)
{
	if (tcscasestr(aOptions, _T("Slow"))) // New mode for v1.0.43.10.  Takes precedence over Alt mode.
		return PixelSearch(aX, aY, aX, aY, 0, 0, aOptions, true); // It takes care of setting ErrorLevel and the output-var.

	Var &output_var = *OUTPUT_VAR;
	output_var.Assign(); // Init to empty string regardless of whether we succeed here.

	CoordToScreen(aX, aY, COORD_MODE_PIXEL);
	
	bool use_alt_mode = tcscasestr(aOptions, _T("Alt")) != NULL; // New mode for v1.0.43.10: Two users reported that CreateDC works better in certain windows such as SciTE, at least one some systems.
	HDC hdc = use_alt_mode ? CreateDC(_T("DISPLAY"), NULL, NULL, NULL) : GetDC(NULL);
	if (!hdc)
		return SetErrorLevelOrThrow();

	// Assign the value as an 32-bit int to match Window Spy reports color values.
	// Update for v1.0.21: Assigning in hex format seems much better, since it's easy to
	// look at a hex BGR value to get some idea of the hue.  In addition, the result
	// is zero padded to make it easier to convert to RGB and more consistent in
	// appearance:
	COLORREF color = GetPixel(hdc, aX, aY);
	if (use_alt_mode)
		DeleteDC(hdc);
	else
		ReleaseDC(NULL, hdc);

	TCHAR buf[32];
	_stprintf(buf, _T("0x%06X"), tcscasestr(aOptions, _T("RGB")) ? bgr_to_rgb(color) : color);
	g_ErrorLevel->Assign(ERRORLEVEL_NONE); // Indicate success.
	return output_var.Assign(buf);
}
Dementsprechend ist GetPixel deine gesuchte Funktion
[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

jNizM
  • Members
  • 928 posts
  • Last active: Jan 12 2018 09:23 AM
  • Joined: 01 Aug 2012
Sollte dann so aussehen:
 
MsgBox % GetPixel(764, 222)

GetPixel(xpos, ypos, hwnd := 0)
{
    hdc := DllCall("user32.dll\GetDC", "Ptr", hWnd)
    Int := DllCall("gdi32.dll\GetPixel", "Ptr", hdc, "Int", xpos, "Int", ypos)
    DllCall("user32.dll\ReleaseDC", "Ptr", hWnd, "Ptr", hdc)
    VarSetCapacity(Hex, 8 << !!A_IsUnicode, 0)
    DllCall("shlwapi.dll\wnsprintf", "Str", Hex, "Int", 8, "Str", "%06I64X", "Int", Int, "Int")
    return "0x" Hex
}

[AHK] 1.1.27.04 x64 Unicode | [WIN] 10 Pro (Version 1709)
My GitHub Profile | Donations are appreciated if I could help you

Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013

Danke JNizM,

 

ich vermute, dass dies genau das Richtige ist was ich benötige,

komme aber momentan weder an mein Skript noch an einen 64-Bit Pc.

mit 32-Bit-PC erhalte ich noch einen seltsamen Farbwert 0x8EC7300.

Ich melde mich dann nochmals wenn ich zu Hause richtig testen konnte.

 

Vielen Dank

Gerdi



Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
sleep 5000          ; zeit um ein Fenster zu aktivieren
WinGetPos,x00,y00,,,A
Time:=A_Now
Loop 700            ; Loop um GetPixel zu messen
{
	Farbe:=GetPixel(x00+A_Index,y00+A_Index)
}
GetPixelTime:=a_now-time
Time:=A_Now
Loop 700             ;loop um PixelGetColor zu messen
{
	PixelGetColor,dummy,A_Index,A_Index
}
PixelGetColorTime:=a_now-time

loop 700               ;loop um zu zeigen, dass es sich um die selben Pixel handelt.
{
    PixelGetColor,dummy,A_Index,A_Index
    If(dummy<>GetPixel(x00+A_Index,y00+A_Index))
        MsgBox % dummy "<>" GetPixel(x00+A_Index,y00+A_Index) " Differenz  bei " A_Index
}


MsgBox GetPixelTime=%GetPixelTime%	PixelGetColorTime=%PixelGetColorTime%	`n`n%x00%,%y00%

GetPixel(xpos, ypos, hwnd := 0)
{
    hdc := DllCall("user32.dll\GetDC", "Ptr", hWnd)
    Int := DllCall("gdi32.dll\GetPixel", "Ptr", hdc, "Int", xpos, "Int", ypos)
    DllCall("user32.dll\ReleaseDC", "Ptr", hWnd, "Ptr", hdc)
    VarSetCapacity(Hex, 8 << !!A_IsUnicode, 0)
    DllCall("shlwapi.dll\wnsprintf", "Str", Hex, "Int", 8, "Str", "%06I64X", "Int", Int, "Int")
    return "0x" Hex
}

Die Funktion GetPixel funktioniert auf einem 64-Bit PC,

danke nochmals jNizM,

aber sie hat die gleiche Eigenschaft wie PixelGetColor.

Nämlich via RDP ausgeführt ist sie rasend schnell,

auf dem Host selbst ausgeführt ist sie sehr langsam.

 

Hierzu habe ich obiges Mess-Skript verwendet.

 

Ergebniss:

 

an der Host-Console

ca. 20 Sekunden Wartezeit auf 700 mal GetPixel

etwa gleich wie 700 mal PixelGetColor . also auch ca. 20 Sekunden.

 

via RDP

ca. 0 Sekunden Wartezeit auf 70 mal GetPixel

wiederum etwa gleich wie 700 mal PixelGetColor, also auch ca. 0 Sekunden.

 

PS. der 3. Loop soll nur zeigen, dass nicht Äpfel mit Birnen verglichen werden.

D.h. Unterschiede wurden keine ausgegeben.

 

Für Tipps wie ich immer in die Geschwindigkeit wie beim RDP-Zugriff komme,

wäre ich dankbar.

 

Gerdi



Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013

Korrektur: alle Loops waren 700 mal



BoBo
  • Members
  • 55 posts
  • Last active: May 04 2017 07:02 AM
  • Joined: 06 Nov 2012

Die Bildschirmabfrage über die Oberfläche der RemoteConsole (damals PCAnywhere) habe ich nie wirklich hinbekommen da die Performance einfach zu sehr variierte.

Ich ließ deshalb das Suchscript direkt auf dem ClientPC laufen und habe die "Kommunikation" (Anstoßen von Scripten etc pp via "handshake"-Dateien auf shared drives) vorgenommen.



Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013

Hallo BoBo,

 

ich vermute Du hast mein Ansinnen falsch herum verstanden. Denn nur via RDP läufts schnell. Direkt an der Konsole (also direkt auf dem ClientPC) größenordnungsmäßig 20 mal lagsamer.

 

P.S.

Ich habe keine andere ähnliche Tools wie PCanywhere, vnc, TeamViewer, ... probiert, da ich ja ganz weg möchte von den Fern-Tools.

 

Danke und Gruß

Gerdi



Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
Beginn:=A_TickCount
Loop 7
{
	i:=A_index
	loop 100
		PixelGetColor,dummy,A_index,i
}
BenoetigteZeit:=A_TickCount-Beginn
MsgBox habe fuer die 700 PixelGetColor Abfragen %BenoetigteZeit% Mili-Sekunden gebraucht.

Suche Tester.

 

Voraussetzung sind 2 PCs über Netzwerk Verbunden.

Nun wäre einmal obiges Skript direkt auf dem ersten PC laufen zu lassen und die Zeit zu notieren. Variante 1

Dann wäre ein RDP-Sitzung von dem 2.PC zum ersten PC aufzubauen und obiges Skript wiederum auf dem ersten PC laufen zu lassen und die Zeit zu Notieren. Variante 2

Bitte hier die Zeiten rückmelden.

 

Ich habe z.B.

14711 Milisekunden für Variante 1 benötigt

und

31 Milisekunden für Varinate 2 benötigt

 

d.h. der Umweg über RDP wird zeitmäßig stark belohnt.

 

Besonders stark bin ich interessiert falls bei jemand die Größenordnung 31 Millisekunden mit Variante 1 gelingt.

Dann hätte man eine Basis die es sich lohnen würde nähere Untersuchungen anzustellen.

 

Bitte die ersten 3 Tests auch rückmelden, wenn die Ergebnisse meinen ähneln.

Ich sollte wissen ob nur ich das Problem habe.

 

vielen Dank im voraus

Gerdi

 



Gerdi
  • Members
  • 39 posts
  • Last active: Aug 06 2015 11:42 PM
  • Joined: 03 Feb 2013
✓  Best Answer

Mittels:

Systemsteuerung

Erweiterte Systemeinstellungen (öffnet Systemeigenschaften)

Reiter: Erweitert

Rubrik: Leistung -> Button Einstellungen (öffnet Leistungsoptionen)

Reiter: Visuelle Effekte -> Für optimale Leistung anpassen

wird mit Administrator-Rechten erreicht,

dass auch direkt an der Konsole, 

mit dem Befehl PixelGetColor,

Freude aufkommt.

 

Danke auch ans AutoIT Forum über welches ich die Lösung fand

Gerdi