Hi,
minimalst Bug gefixt (oder hätte ich BugFix schreiben sollen^^) in der Ausgabe der SSE-Register, dort wurde Aufgrund eines c&p-Fehlers das letzte float nicht richtig dargestellt....
Download s. erster Post
Beiträge von Andy
-
-
Hi,
ZitatSo ich habe mal eben mit dem Standard IE Webbrowser versucht auf die selbe Adresse zu zu greifen, doch er sagt mir immer: "Die Navigation zu der Webseite wurde abgebrochen."
Aha, und wieso sollte dann ein AutoIt-Script die Verbindung herstellen können, obwohl dein Browser das nicht kann?
Viel sinnvoller wäre erstmal, du würdest eine reale Adresse und einen Port nennen, dann könnte man das Problem nachvollziehen... -
Ilse,
Zitates gibt Dinge im Leben die scheint man nie zu lernen.
In meinem Leben sind das Arrays brrrrr
hast du schon einmal mit einer Tabellenkalkulation, z.B. Excel oder ähnlich gearbeitet?
Dort hast du Zeilen und Spalten, die wiederum die Position einer Zelle beschreiben, in der EIN Wert steht.Oder hast du mal auf einer topografischen Karte die Längen- und Breiten-Koordinaten für EINEN Standort bestimmt?
Woher weiss dein Navigationsgerät oder Handy, wo du dich zur Zeit befindest?
Hast du mal einen Blechkuchen in 20 gleiche Teile geteilt?
Oder in der Schule 30 Schüler in 5 Reihen a 6 Bänken verteilt?
Woher weisst du, in welches Stockwerk und welches Zimmer du musst, wenn du einen Hotelschlüssel mit der Nummer 3-16 hast? (der Bindestrich wird auf den Schlüsselanhängern weggelassen)^^
Das sind alles 2D-Arrays, somit kann ich garnicht glauben, dass du noch niemals damit zu tun hattest!
/EDIT/
Ich nehme an, das Beispiel der 30 Schüler ist am einfachsten. Wir verteilen die 30 Schüler auf 5 Reihen a 6 Bänken.
Wenn Peter in der 4. Reihe in der 2. Bank sitzt, was würde ein Kindergartenkind machen, um Peter zu finden?
Es würde jede Reihe Bank für Bank durchgehen und jeden Schüler fragen:" Bist du Peter?"
Genau so macht das der Computer auch, wenn er nicht weiss, in welcher Reihe und in welcher Bank Peter sitzt.... -
Btw,
habe mittlerweile schon von der Version 0401 gehört, auf vielfachen Wunsch der Gemeinde haben die AutoIt- DEV´s sich doch entschlossen, einen "echten" Compiler zu erstellen.Um nicht das gesamte Konzept umzuwerfen wird es in etwa gemacht wie in Javascript:
Das in der EXE wie bisher mitgespeicherte Script wird nicht mehr zeilenweise (langsam) interpretiert, sondern während des Ladevorgangs in den Speicher compiliert.
Dadurch ergeben sich massive Geschwindigkeitssteigerungen, womit auch klar ist, warum der geplante Inline-Assembler NICHT eingeführt wird!
C++- und C# werden massive Probleme bekommen, denn die Entwicklungszeit eines AutoIt-Scriptes ist wesentlich niedriger und damit kostengünstiger als bei herkömmlichen Sprachen!So wird bald auch AutoIt als "DIE" Programmiersprache an den Schulen und Hochschulen eingeführt.
Die Portierung auf Unix- und Linuxsysteme ist auch angedacht, dauert allerdings noch ca. ein halbes Jahr. Somit sind quellcodekompatible Programme auf allen relevanten Systemen möglich!
Steve Jobs war so begeistert, dass er angekündigt hat, die neue Version des Betriebssystems Mac-OS XI AI zu nennen. AI für AutoIt!Inwieweit die beiden Logos zu einem blauen, apfelförmigen A verschmelzen, ist lt. meiner Quelle noch nicht ganz geklärt!
-
Was bei mir keinesfalls fehlen darf:
Sysinternals Suite von Mark Russinovich
-
Ich habe mir mal den trigonometrischen Teil vorgeknöpft und
Spoiler anzeigen
[autoit]For $y=0 To $h
[/autoit]
For $x=0 To $w
$r=$x*Sin($y*$start)
$g=$x*Cos($y*$start)
$b=$x*Tan($y*$start)
$color="0xFF"&Hex($r,2)&Hex($g,2)&Hex($b,2)
_GDIPlus_BitmapSetPixel($bmp,$x,$y,$color)
Next
Nextersetzt durch
Spoiler anzeigen
[autoit]$a=cos($start)
[/autoit] [autoit][/autoit] [autoit]
$b=sin($start)
$sin=0
$cos=1For $y=0 To $h
[/autoit]
$ns=$b*$cos+$a*$sin
$nc=$a*$cos-$b*$sin
$cos=$nc
$sin=$ns
$tan=$sin/$cos
For $x=0 To $w
$rr=$x*$sin
$gg=$x*$cos
$bb=$x*$tan
$color="0xFF"&Hex($rr,2)&Hex($gg,2)&Hex($bb,2)
_GDIPlus_BitmapSetPixel($bmp,$x,$y,$color)
Next
Next
Wie man deutlich sieht, werden die sehr prozessorlastigen Sinus- Kosinus- und Tangensfunktionen völlig aus den Schleifen herausgehalten!
In den Schleifen werden nur noch Multiplikationen und Additionen berechnet. Wer nun denkt, man könnte so den AutoItcode extremst beschleunigen, der irrt!
Was in C++ und auch ASM zu 10-12x schnellerem Code führt, läuft bei AutoIt ins Leere...
Für das folgende 32Bit-Script ist kein AssembleIt nötig, zum Vergleich mit dem "langsamen" ASM-code Zeile 23 und 24 auskommentieren und Script starten.
Bei mir AMD 4850e @2,7Ghz ist das Verhältnis ca 1:10!
Wer also z.B. in C++ viel mit Winkelfunktionen in Schleifen rechnen muss, der hat eine fette Optimierungsmöglichkeit!Spoiler anzeigen
[autoit];#include "AssembleIt.au3"
[/autoit] [autoit][/autoit] [autoit]
#include <GDIPlus.au3>
#include <WindowsConstants.au3>;in der Funktion _CreateNewBmp32() bitte
[/autoit] [autoit][/autoit] [autoit]
;entweder Structmember ändern in biSize, biWidth usw. , oder 3.3.8.1 verwenden, DANKE AUTOIT_DEV´S!!!
;##########################Local $bmp, $lock, $w = 500, $h = 500
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Startup()$hgui = GUICreate("", $w, $h)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()
$DC_gui = _WinAPI_GetDC($hgui)
Global $ptr, $hbmp
$DC_bitmap = _CreateNewBmp32($w, $h, $ptr, $hbmp);schneller code
[/autoit] [autoit][/autoit] [autoit]
Global $tCodeBuffer = DllStructCreate("byte[101]") ;reserve Memory for opcodes
DllStructSetData($tCodeBuffer, 1, "0x9BDBE38B7424048B5424088B7C240C4ADB442404D9442410D9FBD9EED9E889F1D9C2D8CAD9C4D8CADEC1D9CAD8CCD9C9D8CBDEE1D9C1D8F1D9C5D8CBDB1FD9C5D8CADB5F01D9C5D8C9DB5F02D9E8DEEE83C7044975E2DDD8DB442404DDDD4A75BD9BDBE3C3") ;write opcodes into memory;ursprüngliche schleife, 10x langsamer, die folgenden 2 zeilen einfach auskommentieren und script starten
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ Global $tCodeBuffer = DllStructCreate("byte[91]") ;reserve Memory for opcodes
;~ DllStructSetData($tCodeBuffer, 1,"0x9BDBE38B7424048B5424088B7C240C4ADB442408DB442404D9E8D944241089F1D9C2D9C4D8CAD9C0D9FED8CADB1FD9C0D9FFD8CADB5F01D9C0D9F2DDD8D8CADB5F02DDD8D8E283C7044975D6DDD8D9CBD8E1D9CB4A75C79BDBE3C3") ;write opcodes into memory$i = 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$t = TimerInit()
For $bildwert = 6.25 To 6.3 Step 0.000033
$i += 1
;~ $_assembleit_flag = 0
;~ Local $ret = _AssembleIt("float", "F2", "int", $w, "int", $h, "ptr", $ptr, "float", $bildwert);stride,width,height,scan0,wert
$ret = DllCall("user32.dll", "float", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "int", $w, "int", $h, "ptr", $ptr, "float", $bildwert)
_WinAPI_BitBlt($DC_gui, 0, 0, $w, $h, $DC_bitmap, 0, 0, $srccopy)
Next
$m = TimerDiff($t)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
MsgBox(0, "FPS=" & Int($i / $m * 1000), "Anzahl frames: " & $i)While GUIGetMsg() <> -3
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
WEnd_GDIPlus_Shutdown()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_DeleteBitmap32($DC_bitmap, $ptr, $hbmp)
ExitFunc _CreateNewBmp32($iwidth, $iheight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe $HDC und $ptr und handle auf die Bitmapdaten
[/autoit] [autoit][/autoit] [autoit]
$hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
$tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
;entweder Structmember ändern in biSize, biWidth usw. , oder 3.3.8.1 verwenden, DANKE AUTOIT_DEV´S!!!
DllStructSetData($tBMI, 1, DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, 2, $iwidth)
DllStructSetData($tBMI, 3, -$iheight) ;minus =standard = bottomup
DllStructSetData($tBMI, 4, 1)
DllStructSetData($tBMI, 5, 32) ;32 Bit = 4 Bytes => AABBGGRR
$adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32Func _DeleteBitmap32($DC, $ptr, $hbmp)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteDC($DC)
_WinAPI_DeleteObject($hbmp)
$ptr = 0
EndFunc ;==>_DeleteBitmap32;schnell
[/autoit] [autoit][/autoit] [autoit]
;~ Func F()
;~ _("use32")
;~ _("org " & FasmGetBasePtr($Fasm))
;~ _("finit") ;Co Prozessor starten;~ _("mov esi,[esp+4]") ;w
[/autoit] [autoit][/autoit] [autoit]
;~ _("mov edx,[esp+8]") ;h
;~ _("mov edi,[esp+12]") ;scan0;~ _("dec edx")
[/autoit] [autoit][/autoit] [autoit]
;~ ;register im coprostack belegen,
;~ _("fild dword[esp+4]") ;w, in der schleife dann x
;~ _("fld dword[esp+16]") ;st0=start st1=w
;~ _("fsincos") ;st0=a st1=b st1=w
;~ _("fldz") ;st0=sin st1=a st2=b st3=w
;~ _("fld1") ;st0=cos st1=sin st2=a st3=b st4=w;~ _("for_y:") ;Schleifenlabel
[/autoit] [autoit][/autoit] [autoit]
;~ _("mov ecx,esi") ;Schleifenzähler ecx für x
;~ _("fld st2") ;st0=a st1=cos st2=sin st3=a st4=b st5=w
;~ _("fmul st0,st2") ;st0=a*sin st1=cos st2=sin st3=a st4=b st5=w
;~ _("fld st4") ;st0=b st1=a*sin st2=cos st3=sin st4=a st5=b st6=w
;~ _("fmul st0,st2") ;st0=b*cos st1=a*sin st2=cos st3=sin st4=a st5=b st6=w
;~ _("faddp st1,st0") ;st0=b*cos+a*sin st1=cos st2=sin st3=a st4=b st5=w
;~ _("fxch st2") ;st0=sin st1=cos st2=b*cos+a*sin st3=a st4=b st5=w
;~ _("fmul st0,st4") ;st0=b*sin st1=cos st2=b*cos+a*sin st3=a st4=b st5=w
;~ _("fxch") ;st0=cos $st1=b*sin st2=b*cos+a*sin st3=a st4=b st5=w
;~ _("fmul st0,st3") ;st0=a*cos $st1=b*sin st2=b*cos+a*sin st3=a st4=b st5=w
;~ _("fsubrp st1,st0") ;st0=cos st1=sin st2=a st3=b st4=w
;~ _("fld st1") ;st0=sin st1=cos st2=sin st3=a st4=b st5=w
;~ _("fdiv st0,st1") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w;~ _("for_x:") ;Schleifenlabel
[/autoit] [autoit][/autoit] [autoit]
;~ _("fld st5") ;st0=x st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ _("fmul st0,st3") ;st0=x*sin st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ ;BB speichern im pixel
;~ _("fistp dword[edi]") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w
;~ _("fld st5") ;st0=x st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ _("fmul st0,st2") ;st0=x*cos st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ ;GG speichern im pixel
;~ _("fistp dword[edi+1]") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w
;~ _("fld st5") ;st0=x st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ _("fmul st0,st1") ;st0=x*tan st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ ;RR speichern im pixel
;~ _("fistp dword[edi+2]") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w
;~ _("fld1") ;st0=1 st1=tan st2=cos st3=sin st4=a st5=b st6=w
;~ _("fsubp st6,st0") ;st0=tan st1=cos st2=sin st3=a st4=b st5=w;~ _("add edi,4") ;ein pixel weiter
[/autoit] [autoit][/autoit] [autoit]
;~ _("dec ecx") ;Zähler dekrementieren
;~ _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife
;~ _("fstp st0") ;st0=cos st1=sin st2=a st3=b st4=w;~ _("fild dword[esp+4]") ;st0=w st1=cos st2=sin st3=a st4=b st5=w
[/autoit] [autoit][/autoit] [autoit]
;~ _("fstp st5") ;st0=cos st1=sin st2=a st3=b st4=w;~ _("dec edx") ;Zähler dekrementieren
[/autoit] [autoit][/autoit] [autoit]
;~ _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife;~ _("finit") ; copro-stack cleanen
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ _("ret") ;Ende
;~ EndFunc ;==>F;~ ;langsam
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;~ Func F2()
;~ _("use32")
;~ ; _("org " & FasmGetBasePtr($Fasm))
;~ _("finit") ;Co Prozessor starten
;~ ;
;~ _("mov esi,[esp+4]") ;w
;~ _("mov edx,[esp+8]") ;h
;~ _("mov edi,[esp+12]") ;scan0;~ _("dec edx")
[/autoit] [autoit][/autoit] [autoit]
;~ ;register im coprostack belegen,
;~ _("fild dword[esp+8]") ;h
;~ _("fild dword[esp+4]") ;w
;~ _("fld1") ;st0=1
;~ _("fld dword[esp+16]") ;st0=start st1=1.0 st2=w st3=h;~ _("for_y:") ;Schleifenlabel
[/autoit] [autoit][/autoit] [autoit]
;~ _("mov ecx,esi") ;Schleifenzähler ecx für x
;~ _("fld st2") ;st0=x st1=start st2=1 st3=w st4=h
;~ _("for_x:") ;Schleifenlabel
;~ ;Berechung
;~ ;st0=x st1=start st2=1 st3=w st4=h;~ _("fld st4") ;st0=y st1=x st2=start st3=1 st4=w st5=h
[/autoit] [autoit][/autoit] [autoit]
;~ _("fmul st0,st2") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h
;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
;~ _("fsin") ;st0=sin(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
;~ _("fmul st0,st2") ;st0=x*sin(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
;~ ;BB speichern im pixel
;~ _("fistp dword[edi]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
[/autoit] [autoit][/autoit] [autoit]
;~ _("fcos") ;st0=cos(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
;~ _("fmul st0,st2") ;st0=x*cos(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
;~ ;GG speichern im pixel
;~ _("fistp dword[edi+1]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h;~ _("fld st0") ;st0=y*start st1=y*start st2=x st3=start st4=1 st5=w st6=h
[/autoit] [autoit][/autoit] [autoit]
;~ _("fptan") ;st0=1 st1=tan(y*start) st2=y*start st3=x st4=start st5=1 st6=w st7=h
;~ _("fstp st0") ;st0 weg
;~ _("fmul st0,st2") ;st0=x*tan(y*start) st1=y*start st2=x st3=start st4=1 st5=w st6=h
;~ ;RR speichern im pixel
;~ _("fistp dword[edi+2]") ;st0=y*start st1=x st2=start st3=1 st4=w st5=h;~ _("fstp st0") ;st0 weg
[/autoit] [autoit][/autoit] [autoit]
;~ ;st0=x st1=start st2=1 st3=w st4=h
;~ _("fsub st0,st2") ;x=x-1;~ _("add edi,4") ;ein pixel weiter
[/autoit] [autoit][/autoit] [autoit]
;~ _("dec ecx") ;Zähler dekrementieren
;~ _("jnz for_x") ;Wenn Zähler <> 0 dann wiederhole Schleife;~ _("fstp st0") ;st0=start st1=1 st2=w st3=h
[/autoit] [autoit][/autoit] [autoit]
;~ _("fxch st3")
;~ _("fsub st0,st1")
;~ _("fxch st3")
;~ _("dec edx") ;Zähler dekrementieren
;~ _("jnz for_y") ;Wenn Zähler <> 0 dann wiederhole Schleife;~ _("finit") ; copro-stack cleanen
[/autoit]
;~ _("ret") ;Ende
;~ EndFunc ;==>F2 -
@progandy,
ja, genau so wird das ja auch gemacht! Da werden Benchmarks vom Compiler auf bestimmte Prozessoren hin "optimiert", damit der Kunde meint, er kauft einen schnellen Prozessor....
Das war besonders heftig beim Umstieg vom P III auf den P IV. Da wurde eine gigantische Marketingmaschine losgetreten, man sprach von "neuen Generationen" und im Endeffekt waren die "neuen" Prozessoren gemessen am Takt 1/3 langsamer als die alten
.
Also setzt man den Takt und die Spannung so lange hoch bis das Die glüht, verpasst dem Viech einen Monsterkühler, baut stärkere Netzteile ein und verkauft das Ganze dann als Fortschritt!
Warum der Preskott hierzulande nur als "Fresskopp" bezeichnet wurde, versteht sich da von selbst^^ .
Ach ja, die Compiler wurden natürlich dahingehend angepasst, dass sämtliche Nicht-P4 einige Zwangswarterunden in den Benches drehen mussten. Viel hilft viel...
-
Hi,
kann sein, das es, wie UEZ schon angesprochen hat, im GDI eine entsprechende Funktion gibt.
Die Frage ist aber, was du damit anstellen willst?
Mal angenommen, dein Bild ist komplett Grün, also 0x00FF00 bis auf 2 Pixel.
Dann hast du jeweils ein Pixel in Blau 0x0000FF und eins in Rot 0xFF0000Eine Funktion, die dir nun die "maximale" Farbverteilung zurückgibt, würde richtigerweise ein Verhältnis von Rot:Grün:Blau von 1:1:1 ermitteln, aber das ist doch nicht gewünscht?
Bei 1000x1000 Pixeln wäre die richtige Verteilung 1 : 1.000.000(-2) : 1Ansonsten schau mal unter Luminanz, Chrominanz und den verschiedenen Farbräumen/Farbmodellen nach, ob irgendetwas besser dein Problem beschreibt, als "den höchsten Farbanteil eines Bildes zu ermitteln"
-
Zitat
Den allergrößten Unterschied macht allerdings der Programmierstil. Wenn ein Anfänger ein etwas komplexeres Programm in C++ schreibt, kann ein von einem Profi geschriebenes AutoIt-Skript dennoch schneller sein.
Genau DAS ist der eigendliche Haken an der Sache....
Ein langsames Programm bleibt ein langsames Programm, auch wenn es vom schnellsten Compiler übersetzt wurde! Denn auch der kann aus Sch*** kein Gold machen!@Topic
Kaum jemand schreibt heutzutage noch Programme "selbst". Ich gehe davon aus, dass die Lösung sämtlicher programmiertechnischer Probleme und auch Algorithmen schon in irgendeiner Funktion vorliegen. Im Prinzip ist Programmieren nur noch das Suchen und die Aneinanderhängung dieser Funktionen.
Ein Compiler macht nichts anderes.
Zur Frage Basic schneller/langsamer als C++, das liegt einfach daran, dass C++-Funktionen sehr häufig (häufiger als Basic) verwendet werden. Somit ist auch der Anteil an Programmierern höher, welche aus einer "langsamen" Funktion Stück für Stück Speed herauskitzeln. Dies wiederum fliesst in dann in "Standard"-Bibliotheken ein, und somit werden Funktionen von Generation zu Generation zwangsläufig "besser" (oder schneller)
Da es auch in Assembler kein Problem ist, C-Funktionen zu benutzen bzw. dazuzulinken, sieht der Weg des Optimierens eigendlich umgekehrt aus.
Schreib ein C++-Programm, guck in einem Profiler nach, was im Code "langsam" ist, schau dir den entsprechenden Assemblercode im C-Compiler an, entdecke warum der Compiler "langsamen" Code bastelt und schreib eine Mail an die Compilerbauer mit entsprechenden Hinweisen.....die nehmen diese Infos idR dankbar auf!Bzgl. SSE und anderer Prozessor-Erweiterungen, die idR keinen Einzug in heutige Software finden: Ja, das regt mich auch schon auf, seit es diese Möglichkeiten gibt!
Wer kauft sich einen Ferrari und fährt damit ausschliesslich im 1. Gang??? Kein Mensch macht das! Aber jeder kauft einen neuen Rechner und lässt Programme laufen, die für 15 Jahre alte Hardware geschrieben sind....wobei natürlich Ausnahmen die Regel bestätigen
In einer der letzten Linux-Kernel Previews habe ich davon gelesen, dass das Dekodieren von JPG nun auch 4x schneller mittels SSE-Befehlen abgewickelt wird....15 Jahre nachdem die Hardware diese Befehle zur Verfügung stellt. Na klasse, herzlichen Glückwunsch!
Wobei man den Linuxern das auch hoch anrechnen muss, denn in den Windows-Code wird "neue" Technik wohl so schnell nicht Einzug halten!C++ler sind eigendlich fein raus, für so gut wie sämtliche mathematischen Funktionen gibts auch die schnellen SSE-Funktionen! Für Matrixmultiplikation ist Faktor 4 eine Hausnummer, da würde mancher neue Rechner nicht gekauft, wenn der alte nur durch neukompilieren der Software plötzlich x-mal schneller wäre
Intel ist da immer bissl in der Zwickmühle, die haben einen TOP-Compiler, wollen aber gleichzeitig neue Hardware verkaufen. Aber da sich mit Hardware mehr Geld als mit Software verdienen lässt, bleibt die Software unoptimiert und man empfiehlt, die schnellere Hardware zu kaufen
-
Benutze Opera seit es diesen Browser gibt. Falls es doch mal (die immer selteneren) Probleme mit bestimmten Webseiten gibt, nutze ich einmal im Monat Iron/IE
Denn der Internetzexplodierer hat den absolut riesengrossen Vorteil, dass sich niemand ernsthaft traut, diesen Trümmerhaufen NICHT zu unterstützen. Abgesehen von den "valide"-süchtigen Webdesignern, deren Sites ich eh im Leben niemals ansteuern würde^^ -
Hi,
schau dir mal das Beispiel in der Hilfe an zu _WinAPI_CreatePen(). Statt ein Kreuz auf den Bildschirm zu "malen" geht das natürlich auch mit einzelnen Pixeln.... -
Zitat von Weisgarnix
aber was sich tut, ist immer von den beiden Indizes abhängig,
falsch, es ist abhängig von der ControlID des Objektes.
Entweder übernimmst du autoBert´s Vorschlag des onevent-Modus, oder du errechnest dir die "Position" des Controls aus der ID.
Da die ID´s fortlaufend vergeben werden, ist das Verfahren einfach, wenn du die Controls Reihen- oder Spaltenweise anlegst.
Bsp.: Anlegen von 10x10 Controls als 2-dimensionales Array, zeilenweise (erstes Element im Array[1][1])
Dann ergibt sich bei Klick auf das Control 79 die Zeile zu int(ctrlID/Anzahl Zeilen) = int(79/10), somit 7
und die Spalte zu 79-7*anzahl zeilen = 79-7*10 = 9
Das geklickte Objekt hat also die Indizes array[7][9] -
hab mal die dafür vorgesehene API-Funktion verwendet
Spoiler anzeigen
[autoit];mousespeed by andy
[/autoit] [autoit][/autoit] [autoit]
;http://msdn.microsoft.com/en-us/library/ms724947.aspx$speed = 1 ;between 1(slow) and 20(fast)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_mousespeed($speed)Func _mousespeed($speed)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
;if $speed<1 or $speed>20 then return seterror(1,0,0)
$ret = SystemParametersInfo(113, 0, $speed, 0)
EndFunc ;==>_mousespeedFunc SystemParametersInfo($uiAction, $uiParam, $pvParam, $fWinIni)
[/autoit] [autoit][/autoit] [autoit]
;by H2AU3 from Greenhorn
Local $aRes = DllCall("user32.dll", "BOOL", "SystemParametersInfo", _
"UINT", $uiAction, _
"UINT", $uiParam, _
"PTR", $pvParam, _
"UINT", $fWinIni)
If IsArray($aRes) Then Return SetError(0, 0, $aRes[0])
Return SetError(1, 0, 0)EndFunc ;==>SystemParametersInfo
[/autoit]Geschwindigkeit einstellbar von 1(langsam)-20(schnell)
macht die Maus zwar nicht extrem viel schneller, aber passt zum Thema^^
-
Zitat
Ich habe jetzt schon länger in diesem Forum mitgelesen und ich finds bisschen lächerlich dass in jedem zweiten Thread gleich ein Bot vermutet wird.
Es gibt auch Leute die einen PC zu sinnvolleren Dingen nutzen als zocken. 
ehrlich gesagt, verarschen kann ich mich alleine!
Du schreibst 800 Zeilen Code für die Steuerung einer Firmensoftware, das dazu nötige Wissen hast du dir (da erst heute hier angemeldet) autodidaktisch angeeignet. Soweit nix besonderes, das könne viele, gerade mit Hinblick auf die exzellente deutsche Hilfe.
Deine Software debuggen können musst du auch, ansonsten würden deine Mitarbeiter sie wohl kaum einsetzen. Ein gewisser Stand an Kentniss ist also vorrauszusetzen.Und dann entsteht das "Problem", eine Funktion vorzeitig abzubrechen!? Aus der Hilfe zu FUNC kopiert:
Zitat von Hilfe zu FUNC()Mit dem Schlüsselwort Return wird die Funktion verlassen. Im Gegensatz zu den eingebauten Funktionen geben benutzerdefinierte Funktionen immer 0 zurück, sofern kein anderer Returnwert gesetzt wurde.
Man erlaube, dass ich so jemanden absolut nicht ernst nehmen kann...wer schon "länger in diesem Forum mitliest" und die Problematik solch dumpf gestellter Fragen ohne posten von Code nicht kapiert, dem kann ich auch nicht weiterhelfen!/EDIT/ "Script abbrechen aber nicht beenden"....war ggf. "Script pausieren" zu schwierig, da hätte die Sufu auch hunderte Threads ausgespuckt.
autoBert
Da er nach eigenen Angaben schon länger mitliest, ist ihm die Verwendung weit besserer Methoden als "Mausschubsen" natürlich bekannt! In jedem Thread, der sich mit Fernsteuerung von Software befasst, wird darauf hingewiesen und reichlich funktionierende Beispiele gibts auch. Ich hab nichts gegen Anfänger, aber bevor jemand 800 Zeilen Code schreibt, gehe ich davon aus, dass er sich wenigstens annähernd mit der Problemlösung befasst....
-
Hi,
beschreib mal, wozu du das genau brauchst. Ich habe mich in der Vergangenheit mit Software für Blinde auseinandergesetzt, dort gibt es öfter mal Anforderungen, die sich mit der Übertragung von Tönen bzw Geräuschen und rechnergestützter Auswertung befassen. -
Na klar ist das egal obs einige ms mehr oder weniger dauert^^
Aber nochmal zurück zur Größenbeschränkung, unabhängig bliebe man, wenn man das Bild (so habe ich es auch schon irgendwo hier im Forum demonstriert) als *.BMP auf der Platte abspeichert. Den 54 Byte Bitmapheader schreiben, und dann einfach so lange sektorweise "Pixel" in die Datei schreiben, bis die Platte voll ist.
Wie sieht die aktuelle Grössenbeschränkung von Dateien zzt aus? Ich hab noch was mit 4 Gig bei 32Bit im Kopf.
Was da natürlich abgefahren wäre, eine "dynamische" Berechnung: da man ohne weiteres Teile einer Datei für den Zugriff "locken" kann, könnte man mit mehreren Personen bzw. Rechnern gleichzeitig ein Bild rendern bzw ändern/bearbeiten.@Sprenger, DeskStream haben wir schon gut hinbekommen, wäre das eine Idee? Gerade mit Sicht auf "Cloud-Computing" wäre das doch interessant. So ähnlich wie früher mit SETI@home oder heutzutage BOINC. Wer seine Rechnerkapazität bereitstellen möchte, loggt sich ein, holt sich ein Datenpaket und fängt an zu "crunchen". Primzahlen wäre da ein einfacher Einstieg

-
Ich weiss nicht, wieso ihr Beschränkungen bzgl. der Grösse habt....
10000x10000 Pixel sind problemlos machbarSpoiler anzeigen
[autoit];32-Bit only
[/autoit] [autoit][/autoit] [autoit]
;by Andy#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GDIConstants.au3>
#include <Misc.au3>#include <assembleit.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]$hUser32Dll = DllOpen("user32.dll")
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$hGdi32Dll = DllOpen("gdi32.dll")
$iWidth = 10000
$iHeight = 10000$hWnd = GUICreate("FormelDummy", $iWidth, $iHeight)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()$hDC_Gui = _WinAPI_GetDC($hWnd)
[/autoit] [autoit][/autoit] [autoit]Global $ptr_bmp, $hbmp_bmp
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$hDC_bmp = _CreateNewBmp32($iWidth, $iHeight, $ptr_bmp, $hbmp_bmp) ;bitmap erstellen, auf der "gemalt" wird$var = 1111 ;irgendeine startzahl zw. 1 und 1e8
[/autoit] [autoit][/autoit] [autoit]
;$var=30854447 ;testenWhile GUIGetMsg() <> -3
[/autoit] [autoit][/autoit] [autoit]
If _IsPressed("26", $hUser32Dll) Then ;pfeiltaste oben
$var *= 0.99 ;nur sehr grob
If $var < 1 Then $var = 1
ElseIf _IsPressed("28", $hUser32Dll) Then ;pfeiltaste unten
$var *= 1.33 ;nur sehr grob
If $var > 1e8 Then $var = 1e8
EndIf
;Sleep(50) ;ist sonst viel zu schnell
;$_assembleit_flag=0
;$ret=DllCall("user32.dll", "ptr", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer),"int",0,"int",0,"int",0,"int",0)
$t=timerinit()
_assembleit("ptr", "_muster") ;bild berechnen
$m=timerdiff($t)
_WinAPI_BitBlt($hDC_Gui, 0, 0, $iWidth, $iHeight, $hDC_bmp, 0, 0, $srccopy)
WinSetTitle($hWnd, "", "variable = " & $var)
MsgBox(0,"Grafikdemo","Auflösung: "&$iwidth&" x "&$iHeight&" Pixel"&@crlf&stringformat("in %.2f Millisekunden",$m))WEnd
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func _muster()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_("use32")
_("mov edi," & $ptr_bmp) ;pointer bitmap
_("mov esi," & $iWidth) ;fensterbreite (esi verwendet, weil edx beim mul zerstört würde)
_("mov ecx," & $iHeight) ;fensterhöhe
_("@@:") ;ein pixel weiter, bzw eine pixelzeile weiter
;**************** Formel hier...****************
_("mov eax,esi") ;spalte
_("mul ecx") ;spalte*zeile
_("mov ebx," & Int($var)) ;variable
_("mul ebx") ;eax=spalte*zeile*variable=farbe ARGB
;**************** ....bis hier ****************
_("stosd") ;mov [edi],eax : add edi,4 ; pixel in bitmap schreiben
_("mov edx," & $iWidth) ;fensterbreite
_("sub esi,1") ;innerhalb der zeile eins weniger
_("cmovz esi,edx") ;if (esi=)zero then esi=fensterbreite , achtung, befehl erst ab P6 verfügbar!
_("jnz @b") ;if not zero then jump _hoehe;fensterbreite ist noch nicht erreicht
_("loop @b") ;ecx=ecx-1 : jmp hoehe
_("ret")
EndFunc ;==>_musterFunc _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hbmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
[/autoit]
;by Andy
Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
DllStructSetData($tBMI, "Width", $iWidth)
DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
DllStructSetData($tBMI, "Planes", 1)
DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
Local $adib = DllCall($hGdi32Dll, 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
$hbmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
$ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
_WinAPI_SelectObject($hcdc, $hbmp) ;objekt hbitmap in DC
Return $hcdc ;DC der Bitmap zurückgeben
EndFunc ;==>_CreateNewBmp32
die 400Mb-Grafik wird in einigen hundert millisekunden erstellt -
Zitat von Oscar
Was soll das denn werden?
Du kannst ja lustige Fragen stellen
[autoit]
Maus unten, klick, Maus oben, klick, Maus unten, klick......und wenns richtig ans Eingemachte geht, wirds zuIf pixelgetcolor(mousegetpos(0),mousegetpos(1))=0xABCDEFAB then *klick*
[/autoit]...ich greif somit mal vor^^
-
Dafür bietet sich die Funktion TransparentBlt() an!
Damit kannst du eine Farbe wählen, die beim Blitten transparent gezeichnet wird. Alternativ funktioniert das auch mit "normalem" blitten und der Verwendung einer Maske.
Im Script ist auch die Verwendung der Bitmaps als Button vorgestelltSpoiler anzeigen
[autoit]#Include <WinAPIEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#Include <WindowsConstants.au3>Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit]Global Const $STM_SETIMAGE = 0x0172
[/autoit] [autoit][/autoit] [autoit]
Global Const $STM_GETIMAGE = 0x0173Global $hForm, $Pic1, $Pic2, $hPic1, $hPic2, $hObj, $hBmp, $hBitmap1, $hBitmap2, $hDC, $hDestDC, $hDestSv, $hSrcDC, $hSrcSv
[/autoit] [autoit][/autoit] [autoit]; Create GUI
[/autoit] [autoit][/autoit] [autoit]
$hForm = GUICreate('MyGUI', 260, 140)
GUICtrlCreatePic(@WindowsDir&"\angler.bmp",0,0,260,140)
$Pic1 = GUICtrlCreatePic('', 20, 20, 100, 100)
$hPic1 = GUICtrlGetHandle($Pic1)
$Pic2 = GUICtrlCreatePic('', 140, 20, 100, 100)
$hPic2 = GUICtrlGetHandle($Pic2); Create bitmap1
[/autoit] [autoit][/autoit] [autoit]
$hDC = _WinAPI_GetDC($hPic1)
$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap1 = _WinAPI_CreateCompatibleBitmapEx($hDC, 100, 100, 0xFF00FF)
$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap1)
$hBmp = _WinAPI_CreateCompatibleBitmapEx($hDC, 70, 70, 0x00A060)
_WinAPI_DrawBitmap($hDestDC, 15, 15, $hBmp)
;_WinAPI_FreeObject($hBmp)
$hBmp = _WinAPI_CreateCompatibleBitmapEx($hDC, 40, 40, 0xFF00FF)
_WinAPI_DrawBitmap($hDestDC, 30, 30, $hBmp)
;_WinAPI_FreeObject($hBmp)_WinAPI_ReleaseDC($hPic1, $hDC)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_SelectObject($hDestDC, $hDestSv)
_WinAPI_DeleteDC($hDestDC); Create bitmap2
[/autoit] [autoit][/autoit] [autoit]
$hDC = _WinAPI_GetDC($hPic2)
$hDestDC = _WinAPI_CreateCompatibleDC($hDC)
$hBitmap2 = _WinAPI_CreateCompatibleBitmapEx($hDC, 100, 100, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_3DFACE)))
$hDestSv = _WinAPI_SelectObject($hDestDC, $hBitmap2)
$hSrcDC = _WinAPI_CreateCompatibleDC($hDC)
$hSrcSv = _WinAPI_SelectObject($hSrcDC, $hBitmap1)
_WinAPI_TransparentBlt($hDestDC, 0, 0, 100, 100, $hSrcDC, 0, 0, 100, 100, 0xFF00FF)_WinAPI_ReleaseDC($hPic1, $hDC)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_SelectObject($hDestDC, $hDestSv)
_WinAPI_SelectObject($hSrcDC, $hSrcSv)
_WinAPI_DeleteDC($hDestDC)
_WinAPI_DeleteDC($hSrcDC); Set bitmaps to controls
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To 2
_SendMessage(Eval('hPic' & $i), $STM_SETIMAGE, 0, Eval('hBitmap' & $i))
$hObj = _SendMessage(Eval('hPic' & $i), $STM_GETIMAGE)
If $hObj <> Eval('hBitmap' & $i) Then
;_WinAPI_FreeObject(Eval('hBitmap' & $i))
EndIf
NextGUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit]
Until GUIGetMsg() = -3 -
Wenn ich das richtig sehe, wird das gemacht wie im Straßenbau.
Die beiden "Straßen" sind die Tangenten an einem Kreisbogen. An den Enden der Straßen schlägst du die Orthogonalen, die sich im Kreismittelpunkt schneiden.
Reicht das als Info?/EDIT/ der kubische Spline wurde schon von Moritz angesprochen