Beiträge von Mars
-
-
Habe mal was gebastelt. (ein Quick n Dirty Test einiger primitiver Funktionen wie Plus, Mal, Geteilt, usw)
Gemessen wird die Zeit in µs pro Aufruf der Zeile. (Das ganze randomisiert damit keine Muster dazwischenfunken incl Abzug der Zeit für die "Leerfunktion"). Jede dieser Zeiten wird gewichtet und auf 1 normiert (auf MEINEM Computer, bei euch wird der Wert für "µs Gewichtet" vermutlich nicht immer ca. 1.0 sein. Das ist notwendig, damit die Ergebnisse am Ende vergleichbar sind. Stellt dazu in Zeile 4 einen Gewichtungsfaktor ein, sodass ihr beim ersten Bench() Aufruf ca. 1000 Punkte holt). Am Ende wird die Inverse des Mittelwerts mal 1000 als "Score" gewertet (zum schöneren Vergleich). Dieser ist Proportional zur Ausführgeschwindigkeit. (1000 = MEIN Computer, 500 = ein PC auf dem das Skript halb so schnell läuft).
Einfach mal ausführen. Nach dem ersten Bench() wird ein ArrayDisplay geschaltet, dadurch ist das 2te Bench() (mit identischem Ablauf) wesentlich verlangsamt. Wie viel genau sich jede Funktion verlangsamt kann man im Array in Col 3 "µs Gewichtet" ablesen, wenn man zuvor einen Gewichtungsfaktor eingestellt hat sodass man im ersten Bench() aufruf ca. 1000 Punkte bekommt.Aber irgendetwas stimmt hier trotzdem nicht. Ich habe früher schon seeeehr oft versucht den "schnellst möglichen AutoIt Code" für irgendein Problem zu bekommen. Ein Geschwindigkeitsunterschied um den Faktor 7-8 wäre mir da sicherlich mal aufgefallen, zumal ich zum Debuggen oft ArrayDisplay nutze. Das kann doch nicht sein, dass das bis heute niemand gemerkt hat?! Meine Vermutung ist, dass es an Windows liegt. Irgendein Sicherheitslückenschließungsupdate das aus unerfindlichen Gründen exakt die Schnittstelle von AutoIt zu Windows trifft, sodass AutoIt davon maximal betroffen ist während andere "nur" 10% an Geschwindigkeit einbüßen. Die alternative wäre, dass es an AutoIt liegt, aber an der Exe (und vorallem an der BETA) hat sich seit Jahrzehnten nichts geändert und ich halte es für extrem unwahrwahrscheinlich, dass das ich das bis heute nicht mitgekriegt hätte wenn es schon immer so gewesen wäre.
Code
Alles anzeigen#include <Array.au3> Local $Gewichtungsfaktor = 1 Local $fScore1 = Bench(2000, $Gewichtungsfaktor) ; Öffnet am Ende ein ArrayDisplay Local $fScore2 = Bench(2000, $Gewichtungsfaktor) ; Ist weeeeesentlich langsamer ConsoleWrite(StringFormat('%.2f', $fScore1) & ' (100.00%)' & @CRLF & StringFormat('%.2f', $fScore2) & ' (' & StringFormat('%.2f', $fScore2/$fScore1*100) & '%)' & @CRLF) Func Bench($n = 2000, $m = 1) Local $u = 13, $r = 0 Local $aBench[$u+1][5] $aBench[0][0] = 'Beschreibung' $aBench[0][1] = 'Funktionspointer' $aBench[0][2] = 'µs/Aufruf' $aBench[0][3] = 'µs Gewichtet' $aBench[0][4] = 'Gewichtung' $aBench[1][0] = 'Local $a' $aBench[1][1] = _01 $aBench[1][2] = 0 $aBench[1][3] = 0 $aBench[1][4] = 24 * $m $aBench[2][0] = 'Local $aaaaa' $aBench[2][1] = _02 $aBench[2][2] = 0 $aBench[2][3] = 0 $aBench[2][4] = 23 * $m $aBench[3][0] = 'Local $aaaaaaaaaa' $aBench[3][1] = _03 $aBench[3][2] = 0 $aBench[3][3] = 0 $aBench[3][4] = 20 * $m $aBench[4][0] = '$a = 0' $aBench[4][1] = _04 $aBench[4][2] = 0 $aBench[4][3] = 0 $aBench[4][4] = 10 * $m $aBench[5][0] = '$a += 0' $aBench[5][1] = _05 $aBench[5][2] = 0 $aBench[5][3] = 0 $aBench[5][4] = 10 * $m $aBench[6][0] = '$a += b' $aBench[6][1] = _06 $aBench[6][2] = 0 $aBench[6][3] = 0 $aBench[6][4] = 8 * $m $aBench[7][0] = '$a *= b' $aBench[7][1] = _07 $aBench[7][2] = 0 $aBench[7][3] = 0 $aBench[7][4] = 8 * $m $aBench[8][0] = '$a /= b' $aBench[8][1] = _08 $aBench[8][2] = 0 $aBench[8][3] = 0 $aBench[8][4] = 8 * $m $aBench[9][0] = 'should be zero' $aBench[9][1] = _09 $aBench[9][2] = 0 $aBench[9][3] = 0 $aBench[9][4] = 0 * $m $aBench[10][0] = 'Timerinit()' $aBench[10][1] = _10 $aBench[10][2] = 0 $aBench[10][3] = 0 $aBench[10][4] = 15 * $m $aBench[11][0] = '$a = $a ^ 1.01' $aBench[11][1] = _11 $aBench[11][2] = 0 $aBench[11][3] = 0 $aBench[11][4] = 2 * $m $aBench[12][0] = '$a = $a ^ $b' $aBench[12][1] = _12 $aBench[12][2] = 0 $aBench[12][3] = 0 $aBench[12][4] = 2 * $m $aBench[13][0] = '$a = Sin(3.1415)' $aBench[13][1] = _13 $aBench[13][2] = 0 $aBench[13][3] = 0 $aBench[13][4] = 3 * $m For $i = 1 To $n Step 1 $r = Random(1, $u, 1) $aBench[$r][2] += $aBench[$r][1]() $aBench[$r][3] += 1 Next Local $fScore For $i = 1 To $u Step 1 $aBench[$i][2] /= $aBench[$i][3] $aBench[$i][3] = $aBench[$i][2] * $aBench[$i][4] $fScore += $aBench[$i][3] Next $fScore /= ($u - 1) ; Should be Zero wird nicht mit eingerechnet. $fScore = Round(1000 / $fScore, 2) ; fScore ist auf 1000 normiert (auf meinem PC, gemacht wurde das mit den Gewichtungen) ; Ist fScore > 1000 ist der Benchmark proportional schneller gelaufen als bei mir ; Ist fScore < 1000 ist der Benchmark porportional langsamer gelaufen als bei mir ; Proportional bedeutet -> Score von 500 -> halb so schnell. _ArrayDisplay($aBench, $fScore) Return $fScore EndFunc Func _010() Local $t = TimerInit() For $i = 1 To 1e3 Step 1 Next Return TimerDiff($t) EndFunc Func _01() Local $t = TimerInit() For $i = 1 To 1e3 Step 1 Local $a Next Return TimerDiff($t) - _010() EndFunc Func _02() Local $t = TimerInit() For $i = 1 To 1e3 Step 1 Local $aaaaa Next Return TimerDiff($t) - _010() EndFunc Func _03() Local $t = TimerInit() For $i = 1 To 1e3 Step 1 Local $aaaaaaaaaa Next Return TimerDiff($t) - _010() EndFunc Func _04() Local $t = TimerInit(), $a = 0 For $i = 1 To 1e3 Step 1 $a = 0 Next Return TimerDiff($t) - _010() EndFunc Func _05() Local $t = TimerInit(), $a = 0 For $i = 1 To 1e3 Step 1 $a += 0 Next Return TimerDiff($t) - _010() EndFunc Func _06() Local $t = TimerInit(), $a = 1, $b = 1 For $i = 1 To 1e3 Step 1 $a += $b Next Return TimerDiff($t) - _010() EndFunc Func _07() Local $t = TimerInit(), $a = 1.5, $b = 1.5 For $i = 1 To 1e3 Step 1 $a *= $b Next Return TimerDiff($t) - _010() EndFunc Func _08() Local $t = TimerInit(), $a = 1.5, $b = 1.5 For $i = 1 To 1e3 Step 1 $a /= $b Next Return TimerDiff($t) - _010() EndFunc Func _09() Local $t = TimerInit() For $i = 1 To 1e3 Step 1 Next Return TimerDiff($t) - _010() EndFunc Func _10() Local $t = TimerInit() For $i = 1 To 1e3 Step 1 TimerInit() Next Return TimerDiff($t) - _010() EndFunc Func _11() Local $t = TimerInit(), $a = 1.5 For $i = 1 To 1e3 Step 1 $a = $a ^ 1.01 Next Return TimerDiff($t) - _010() EndFunc Func _12() Local $t = TimerInit(), $a = 1.5, $b = 1.01 For $i = 1 To 1e3 Step 1 $a = $a ^ $b Next Return TimerDiff($t) - _010() EndFunc Func _13() Local $t = TimerInit(), $a = 0 For $i = 1 To 1e3 Step 1 $a = Sin(3.1415) Next Return TimerDiff($t) - _010() EndFunc
-
Ich habe mich tatsächlich auch nach ein paar Tagen hingesetzt und versucht etwas zusammenzubauen. Leider ist das nichts geworden weil ich einen Klotz im Kopf hatte. Dachte ich muss eine Struct erstellen und irgendeinen Weg finden ffmpeg zu sagen wohin es den Frame dekodieren soll (so nach dem Motto: Hier hast du eine Adresse, schreib!). Std und CMDlines sind für mich ein Buch mit sieben Siegeln (dicht gefolgt von RegEx). Ich bedanke mich vielmals, dass du das Problem für mich gelöst hast.
lg
M
-
Ich glaube das Dict ist ohnehin schneller (habe es nicht ausprobiert). Falls es intern mit einem Hashtable arbeitet sollte die Zugriffszeit nahe O(1) sein und viel mehr als das ist nicht drin (nur eine Vermutung)
Ein Vorteil der ArrayBinSearch + Regex ist, dass man so z.B. auch Schreibfehler/TeilMatches gut abarbeiten kann (hier ist ein Hashtable aufgeschmissen, da ein Schreibfehler idr zu einem völlig unterschiedlichen Hashwert führt), da das hier aber nicht gebraucht wird ist es wahrscheinlich Wurst welche Variante du im Endeffekt verwendest. Aber die Methode ansich kannst du dir merken, villeicht braucht man sowas ja später malM
-
Die Info im Installer ist vermutlich schon 10 Jahre alt und von daher kann man sie getrost ignorieren. Solange du die Software nur auf Computern einsetzt die neuer als 10 Jahre sind (und damit meistens 64Bit haben) ist es egal welche Version du verwendest.
Edit: Wie Chip im Folgekommentar anmerkt stimmt das nicht immer. Habe persönlich aber noch nie Probleme gehabt was mich zum Schreiben dieses Kommentars verleitet hat.
-
BST = Binary Search Tree.
Du kannst ein sortiertes 1D Array wie einen Binärbaum handhaben. Die Zugriffszeit ist dann Log(n) https://de.wikipedia.org/wiki/Bin%C3%A4re_Suche. -
Moin,
Vorab: Ich habe mich noch nicht näher mit dem Thema befasst und noch nichts ausprobiert. Das hier ist nur ein Thread in dem ich nachfrage ob jemand schonmal soetwas gebastelt hat, damit ich mir die Mühe ggf. sparen kann (wozu das Rad ein 10tes Mal erfinden).
Es geht um folgendes:
Ich suche eine Funktion (am besten in AutoIt gewrappt) die mit einem frei zugänglichen Decoder (z.B. ffmpeg) einen Frame (Angabe als Integer, Frame 0 = erster Frame des Videos) aus einer Videodatei dekodiert und in eine Struct legt (kein Dump auf die Festplatte), sodass man anschließend Zugriff auf die Pixeldaten hat. Dabei sollten verschiedene container (mp4, mov, avi, mkv, usw) sowie verschiedene interne Formate (VP9, h264, h265, usw) unterstützt werden. Schön wäre auch wenn man die Videodatei (die ggf ziemlich groß ist) nicht jedes Mal neu einlesen muss, sondern laden kann und dann beliebige Frames herausziehen kann.
Ich weiß dass das möglich ist und villeicht hat ffmpeg sogar schon eine vorgefertigte Funktion für genau dieses Szenario (auf die Schnelle habe ich aber nur eine Funktion die den Frame auf die Platte schreibt gefunden).
Ziel der Aktion:
Ich möchte eine Methode basteln um "bessere" Screenshots von Videos machen zu können (dabei geht es vorallem um selbst aufgenommene Videos via Handy/Kamera usw). Leider ist da immer starkes Rauschen (insbesondere auf Pixelebene) involviert. Wenn man aber z.B. 5 Frames in Folge verwendet (vorausgesetzt Objekt und Kamera bewegen sich nicht viel) könnte man mit minimaler Bewegungskorrektur + Mittelwertbildung ein besseres Bild erhalten, als wenn man von den 5 Frames einfach den Mittleren auswählt.
Daher die Frage: Hat das schonmal jemand gemacht und gibt es villeicht bereits eine gewrappte AutoIt Version?
lg
Mars
-
Habe auch VSC installiert und das Beispiel tut bei mir auch was es soll.
Üblicherweise habe ich VSC aber für Go und C++ in Verwendung, Für AutoIt gibts ja ISN (was für die Sprache zugeschnitten wurde), oder Scite, wenn man etwas mehr als Notepad, aber nicht "viel" mehr will
M
-
Wenn dein Spript Adminrechte braucht versuche mal #RequireAdmin am Anfang (in die erste Zeile) zu schreiben, dadurch kann das Programm nur als Admin ausgeführt werden, egal welcher Benutzer angegeben wird und egal wie der Admin heißt (glaube ich zumindest).
edit. obwohl ich glaube du willst das das automatisch passiert (also dass das Windows Fenster in dem man sich als Admin anmeldet nicht erscheint). Dann hilft meine Idee nichts...
-
Das ist wirklich seltsames Verhalten. Bei mir kann ich anstellen was ich will (msgboxen, tooltips, sonstiges) und der Text bleibt immer erhalten (Das liegt möglicherweise an irgendwelchen Windows-Updates, ich kann mich nämlich erinnern vor langer langer Zeit immer damit gekämpft zu haben das plötzlich Teile aus dem GFX/DC eines Fensters plötzlich "verschwunden" sind weil etwas davorlag. Aber das ist so lange her das ich kaum noch weiß warum das passiert ist). Was nicht abgedeckt ist in meinem Beispiel ist WM_PAINT (dafür braucht man einen weiteren Backbuffer der immer das letzte gerenderte Bild enthält. Den kann man dann Eventdriven ins GUI zeichnen ohne das etwas fehlt) und einige andere WMs. Falls es WM_PAINT ist sollte das Problem leicht zu beheben sein, falls nicht muss weiter gebohrt werden bis man weiß was der Verursacher ist.
Schau mal ob das Problem hier immernoch auftritt, ich kann es bei mir leider nicht reproduzieren...
Code
Alles anzeigen#include <GDIPlus.au3> Opt('GUIOnEventMode', 1) Global Const $sTitle = 'Test' Global Const $iW = 400 Global Const $iH = 400 Global $bExit = False _GDIPlus_Startup() Global $hGUI = GUICreate($sTitle, $iW, $iH + 30) Global $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI) Global $hBMP = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX) Global $hBMP2 = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX) Global $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP) Global $hBUF2 = _GDIPlus_ImageGetGraphicsContext($hBMP2) Global $hFAM = _GDIPlus_FontFamilyCreate('Arial') Global $hFON = _GDIPlus_FontCreate($hFAM, 35, 0, 2) Global $hFOR = _GDIPlus_StringFormatCreate() Global $hBRU = _GDIPlus_BrushCreateSolid(0xFF303030) Global $hMAT = _GDIPlus_MatrixCreate() Global $hSLI = GUICtrlCreateSlider(10, $iH + 5, $iW - 20, 20) _GDIPlus_GraphicsSetTextRenderingHint($hBUF, 4) GUISetOnEvent(-3, EVENT, $hGUI) GUIRegisterMsg(0xF, WM_PAINT) OnAutoItExitRegister('Xit') GUISetState(@SW_SHOW, $hGUI) While Not $bExit And Sleep(10) _GDIPlus_GraphicsClear($hBUF, 0xFFE0E0E0) ; Clear BUF Local $tRect = _GDIPlus_RectFCreate(200, 200) Local $alpha = GUICtrlRead($hSLI) * 360/100 _GDIPlus_MatrixTranslate($hMAT, -200, -200, True) ; MatrixRotate geht immer um den Ursprung. Ist der Text bei (x,y)=(200,200), muss die Matrix dementsprechend verschoben werden. _GDIPlus_MatrixRotate($hMAT, $alpha, True) ; Rotation um irgendeinen Winkel _GDIPlus_MatrixTranslate($hMAT, 200, 200, True) ; Matrix zurückverschieben _GDIPlus_GraphicsSetTransform($hBUF, $hMAT) ; Matrix anwenden _GDIPlus_GraphicsDrawStringEx($hBUF, 'Kraft[N]', $hFON, $tRect, $hFOR, $hBRU) ; Text zeichnen _GDIPlus_MatrixTranslate($hMAT, -200, -200, True) ; Rücktransformation damit man danach noch andere sachen Zeichnen kann _GDIPlus_MatrixRotate($hMAT, -$alpha, True) _GDIPlus_MatrixTranslate($hMAT, 200, 200, True) _GDIPlus_GraphicsSetTransform($hBUF, $hMAT) ; Matrix anwenden Jetzt ist wieder alles beim alten. _GDIPlus_GraphicsDrawStringEx($hBUF, 'Kraft[N]', $hFON, $tRect, $hFOR, $hBRU) ; Text zeichnen (der hier wird jetzt statisch sein und kann sich nicht drehen) _GDIPlus_GraphicsDrawImageRect($hBUF2, $hBMP, 0, 0, $iW, $iH) ; Ziel in hBUF2 speichern _GDIPlus_GraphicsDrawImageRect($hGFX, $hBMP2, 0, 0, $iW, $iH) ; hBUF2 zeichnen WEnd Func WM_PAINT() ; Zeichnet hBUF2 in dem sich ansich immer ein fertig gerendertes Bild befinden sollte... _GDIPlus_GraphicsDrawImageRect($hGFX, $hBMP2, 0, 0, $iW, $iH) EndFunc Func EVENT() Switch @GUI_CtrlId Case -3 $bExit = True EndSwitch EndFunc Func Xit() _GDIPlus_MatrixDispose($hMAT) _GDIPlus_BrushDispose($hBRU) _GDIPlus_StringFormatDispose($hFOR) _GDIPlus_FontDispose($hFON) _GDIPlus_FontFamilyDispose($hFAM) _GDIPlus_GraphicsDispose($hBUF2) _GDIPlus_BitmapDispose($hBMP2) _GDIPlus_GraphicsDispose($hBUF) _GDIPlus_BitmapDispose($hBMP) _GDIPlus_GraphicsDispose($hGFX) _GDIPlus_Shutdown() EndFunc
M
-
Habe mal ein Beispiel zu frei rotierbarem Text gemacht, ich hoffe das Löst dein Problem.
Code
Alles anzeigen#include <GDIPlus.au3> Opt('GUIOnEventMode', 1) Global Const $sTitle = 'Test' Global Const $iW = 400 Global Const $iH = 400 Global $bExit = False _GDIPlus_Startup() Global $hGUI = GUICreate($sTitle, $iW, $iH + 30) Global $hGFX = _GDIPlus_GraphicsCreateFromHWND($hGUI) Global $hBMP = _GDIPlus_BitmapCreateFromGraphics($iW, $iH, $hGFX) Global $hBUF = _GDIPlus_ImageGetGraphicsContext($hBMP) Global $hFAM = _GDIPlus_FontFamilyCreate('Arial') Global $hFON = _GDIPlus_FontCreate($hFAM, 35, 0, 2) Global $hFOR = _GDIPlus_StringFormatCreate() Global $hBRU = _GDIPlus_BrushCreateSolid(0xFF303030) Global $hMAT = _GDIPlus_MatrixCreate() Global $hSLI = GUICtrlCreateSlider(10, $iH + 5, $iW - 20, 20) _GDIPlus_GraphicsSetTextRenderingHint($hBUF, 4) GUISetOnEvent(-3, 'EVENT', $hGUI) OnAutoItExitRegister('Xit') GUISetState(@SW_SHOW, $hGUI) While Not $bExit And Sleep(10) _GDIPlus_GraphicsClear($hBUF, 0xFFE0E0E0) Local $tRect = _GDIPlus_RectFCreate(200, 200) Local $alpha = GUICtrlRead($hSLI) * 360/100 _GDIPlus_MatrixTranslate($hMAT, -200, -200, True) ; MatrixRotate geht immer um den Ursprung. Ist der Text bei (x,y)=(200,200), muss die Matrix dementsprechend verschoben werden. _GDIPlus_MatrixRotate($hMAT, $alpha, True) ; Rotation um irgendeinen Winkel _GDIPlus_MatrixTranslate($hMAT, 200, 200, True) ; Matrix zurückverschieben _GDIPlus_GraphicsSetTransform($hBUF, $hMAT) ; Matrix anwenden _GDIPlus_GraphicsDrawStringEx($hBUF, 'Kraft[N]', $hFON, $tRect, $hFOR, $hBRU) ; Text zeichnen _GDIPlus_MatrixTranslate($hMAT, -200, -200, True) ; Rücktransformation damit man danach noch andere sachen Zeichnen kann _GDIPlus_MatrixRotate($hMAT, -$alpha, True) _GDIPlus_MatrixTranslate($hMAT, 200, 200, True) _GDIPlus_GraphicsSetTransform($hBUF, $hMAT) ; Matrix anwenden Jetzt ist wieder alles beim alten. _GDIPlus_GraphicsDrawStringEx($hBUF, 'Kraft[N]', $hFON, $tRect, $hFOR, $hBRU) ; Text zeichnen (der hier wird jetzt statisch sein und kann sich nicht drehen) _GDIPlus_GraphicsDrawImageRect($hGFX, $hBMP, 0, 0, $iW, $iH) WEnd Func EVENT() Switch @GUI_CtrlId Case -3 $bExit = True EndSwitch EndFunc Func Xit() _GDIPlus_MatrixDispose($hMAT) _GDIPlus_BrushDispose($hBRU) _GDIPlus_StringFormatDispose($hFOR) _GDIPlus_FontDispose($hFON) _GDIPlus_FontFamilyDispose($hFAM) _GDIPlus_GraphicsDispose($hBUF) _GDIPlus_BitmapDispose($hBMP) _GDIPlus_GraphicsDispose($hGFX) _GDIPlus_Shutdown() EndFunc
Edit: Habe mir jetzt WriteRotate nicht ausprobiert, aber allgemein ist WinAPI und GDI+ nur in einigen Fällen kompatibel, im Allgemeinen greifen die Funktionen nicht ineinander. Man kann kein Rechteck via WinAPI auf ein GDI+ GFX zeichnen und kein GDI+ Rechteck auf einen usw...
lg
M
-
Ich würde mir einfach die gewünschte Funktion via _GDIPlus_GraphicsDrawLine selbst basteln. Wenn du das Array für DrawCurve bereits hast, kannst du via DrawLine immer Punkt [i] und Punkt [i+1] verbinden (beginnend bei 1 und endend ein Element vor dem letzten Element).
-
Ich verstehe einfach nicht wie die Antivirenhersteller so unfassbar bescheuert sein können und nicht mal den Interpreter whitelisten. Das ist als würde man das "PE" am Beginn einer .exe als Indikator nutzen um einen Virus zu erkennen. Die Probleme werden wohl nie aufhören, solange niemand merkt, dass ein Interpreter für sich weder gut noch schlecht ist, sondern eben einfach nur ein Interpreter.
-
Also ich bin jetzt verwirrt.
Hier ist ein Testskript. Wenn ich via _WinAPI_GetWindowDC (via GetDC bekommt man nur die ClientArea) den DC hole und via BitBlt hineinzeichne (BLACKNESS/WHITENESS brauchen dafür keine Brush/Bitmaps oder ähnliches sondern funktionieren direkt) sieht es für mich aus als würde das Koordinatensystem bei 0/0 oben links anfangen, aber die Titelleiste wird über den oberen Teil gezeichnet.C
Alles anzeigen#include <WinApi.au3> #include <WindowsConstants.au3> Global $w = 512, $h = 256 Global $hGUI = GUICreate('Test', $w, $h) Global $hDC = _WinAPI_GetWindowDC($hGUI) GUISetState() GUISetBkColor(0x202020) While GUIGetMsg() <> -3 _WinAPI_BitBlt($hDC, 10, 10, $w - 20, $h - 20, 0, 0, 0, $WHITENESS) _WinAPI_BitBlt($hDC, 0, 0, 100, 100, 0, 0, 0, $BLACKNESS) WEnd _WinAPI_ReleaseDC($hGUI, $hDC)
-
Dann habe ich da etwas falsches in Erinnerung. War mir eigentlich ziemlich sicher, dass die Koordinate 0/0 immer oben links in der clientarea ist und nicht oben links in der Titelleiste. Muss ich wohl mal ausprobieren.
-
Technisch gesehen wird auch nur der DC von der ClientArea und nicht vom "gesamten Fenster" geholt (Rand & Titelleiste sind da nicht enthalten).
Edit: ich habe das "window" überlesen und gedacht es ginge um die Funktion GetDC. Diese Aussage stimmt so nicht. -
und ggf. bei allen _IsPressed() Funktionen ein "02" einfügen, dann wird das Skript aktiviert, sobald man die rechte Maustaste klickt statt der Mittleren (die ja heutzutage nicht mehr jeder hat)
Außerdem kann ein Sleep(10) in der While _IsPressed() Schleife auch nicht schaden, sonst hat man volle CPU Auslastung obwohl das an dieser Stelle garnichts bringt.
lg
M
-
Aus welcher Sprache wurde das denn Übersetzt?
Ich habe schon einiges an Spielen programmiert (vorallem Minispiele in 2D), meistens waren das tausende Zeilen Code der wesentlich komplizierter war als ein einfaches Makro das die Maus irgendwie bewegt. Wenn ihr ein Spiel schreiben könnt könnt ihr auch die Maus bewegen um euer Spiel zu testen.
-
Falls es nur eine S Kurve (im Bereich -1 < y < 1) sein muss und nicht unbedingt die Sigmoid-Funktion kannst du auch x/(1+Abs(x)) als Funktion nutzen. Vorteil wäre der Entfall der sehr rechenaufwändigen POW Funktion.
-
Wenn man eine Datei die Funktionen enthält als .a3x kompiliert und diese in einem anderen Script per Include einfügt wird die Funktion nicht erkannt. Eine Lösung für dieses Problem ist, dass man die .a3x Datei umbenennt zu z.B. .a3y. Wenn man diese datei via Include einfügt funktioniert alles wie gewohnt.
Code: a.au3#Region ;**** Directives created by AutoIt3Wrapper_GUI **** #AutoIt3Wrapper_Outfile_type=a3x #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** Func MyFunc() MsgBox(1, 'Hallo', 'Hallo') EndFunc
Bin nicht sicher ob das bei jedem so ist, aber intuitiv ist dieses Verhalten nicht. Liegt vermutlich an Au3Check. Kann das jemand reproduzieren?
lg
M