1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • FPS

    • Andy
    • 4. Mai 2012 um 20:59

    Hi,
    dieses Phänomen kennt jeder, der einmal größere Scripte mit AutoIt "getimed" hat. Manchmal läuft das Script mit gleichbleibend konstanter Geschwindigkeit, manchmal wird es schneller und manchmal langsamer....
    Imho hat das aber weniger mit AutoIt zu tun, als mit dem System Windows und dessen Multitasking/Multithreading. AutoIt ist nur "empfänglicher" infolge seiner Struktur (Interpretersprache)
    Niemand ist heutzutage in der Lage, Systemevents vorherzusagen. Dort schaufelt Windows im Speicher herum, da werden irgendwelche Daten über den Bus geschoben, woanders laufen 326 Threads im Programmkontext des Users, die auch alle Zeit vom System beanspruchen. Und alle paar Millisekunden feuern noch irgendwelche Hardwareinterrupts dazwischen.....mal abgesehen vom hoch- und runtertakten jedes einzelnen Cores des Prozessors und den 8 Schlafmodi...

    Soviel zum System an sich, daran kann man nichts ändern!

    Aber wenn ich folgende Sätze lese, dann fange ich an zu zweifeln :thumbdown: :

    Zitat

    Jedenfalls läuft mein Script nur mit 60 oder mehr FPS flüssig. Selbst 50 ruckelt noch etwas.

    Wundert mich schon, da ein "normales" LCD mit 50-60Hz angesteuert wird, alles an "mehr" FPS steht als Zahl auf dem Display, definitiv ankommen am Auge tun aber nur 60 FPS.....wer da einen Unterschied "sehen" kann, der verfügt über übernatürliche Kräfte^^

    Zitat

    Vielleicht klappt das ja bei manchen Personen, auf meinem Computer aber definitiv nicht.).

    DAS liegt dann wohl definitiv am Computer, oder etwa nicht? Imho "klappen" AutoItscripte auf den ältesten Gurkenkisten genauso wie auf den neuesten Rechnern.

    Zitat

    Meine While-Schleife hat ein Sleep(), und zwar While Sleep(10) <hier der Inhalt> WEnd
    Aber das würde trotzdem einen ANSTIEG von konstanten 50 auf konstante 64 FPS nicht eklären :P

    Bei 50 FPS dauert ein Frame 20ms, abzüglich deines Sleep(10) bleiben für dein Script 10ms pro loop. Bei 64 FPS dauert der loop nur noch 5ms, wird also DOPPELT SO SCHNELL abgearbeitet!

    Daten per prefetching in den Cache zu laden kann Programme extrem beschleunigen. Per Assembler- oder C-Programm kann man bei speicherintensiven Reads/Writes schon mal den Faktor 1,5 an Speed rausholen mit EINEM Befehl! In native AutoIt funktioniert kein Cache-Management, da funkt zu viel dazwischen...allerdings kann es schon mal sein, dass die gerade benötigten Daten im Cache liegen, dann schlägt der Geschwindigkeitsboost auch bei einem AutoItprogramm zu. Im nächsten Programmdurchlauf hatte Windows die Daten im Speicher vielleicht vorher sogar auf die Platte ausgelagert...100 mal langsamer erfolgt der nächste Zugriff, noch Fragen?

    Generell MUSS man ein Script sehen, um zu beurteilen, was warum wie oder auch nicht funktioniert! Also lass sehen :D

  • Bildvergleich - bzw Farbe auslesen

    • Andy
    • 4. Mai 2012 um 18:31

    Hi,
    falls du über die Excel-Udf´s nicht weiter kommst (das würde ich bevorzugen //EDIT ok, KEIN Excel//), kannst du auch "PushTheButton" ausprobieren. Damit kann man bestimmte Ausschnitte auf dem Bildschirm auswählen und diese suchen und anklicken lassen.

  • GDI+ 3D Object Viewer (Wavefront .obj Format)

    • Andy
    • 29. April 2012 um 12:25

    Hi,
    Klasse Script!

    Zitat

    Am längsten dauert (abgesehen von dem PathWarp Zeug) in den meisten Fällen das Zeichnen wie mir scheint.

    Habs bei mir mal durchgestoppt, am definitiv längsten dauert die FOR/TO-Schleife mit _GDIPlus_GraphicsDrawLine(), nämlich bei mir beim Torus-Beispiel mit 900 Linien (gezoomt ca. 20.000 Pixel) ca. 230ms => 4 FPS....

    Ohne Worte, denn "LinienZeichnen" ist seit Anbeginn aller Zeiten die wohl ausoptimierteste Funktion auf dem PC überhaupt.
    Da unabhängig von der Menge der gezeichneten Pixel/Linie die FPS gleich bleiben, kann das nur heissen, dass es (wieder mal) einen irren Funktionsoverhead bei _GDIPlus_GraphicsDrawLine() gibt...
    Typisch MS-API-Funktionen: 99% wildes durch den Kernel/Treiber gehüpfe, 1% Funktionsabarbeitung :thumbdown:

  • FPS einstellen

    • Andy
    • 27. April 2012 um 06:51

    Hi,

    Zitat

    Haha bei Minecraft sind 25 FPS innerhalb von 100ms, die restlichen 900 ms bleiben als ein Bild

    genau so sollte man es nicht machen....

  • Grafik Engine Erstellen

    • Andy
    • 26. April 2012 um 21:00

    Hi,

    Zitat

    Nur ASM kommt sonst nicht mit Tranzparenz klar

    stimmt nicht^^
    Die "Bitmaps" verwenden beim Blitten nicht den Alphakanal, aber das kann man per TransparentBlt() oder entsprechendem Code (Verknüpfung von Source- und Destination-Pixel mit dem Alphakanal) beeinflussen.

  • FPS einstellen

    • Andy
    • 25. April 2012 um 21:25

    Hi,

    Zitat

    Ich verstehe es immer noch nicht ...


    In einer Schleife laufen diverse Berechnungen, logischerweise auf einem schnellen Rechner schneller als auf einem Langsamen
    Damit sowohl auf dem schnellen Rechner als auch auf dem langsamen Rechner die Berechnungen IMMER IN GLEICHER Geschwindigkeit ablaufen, muss man sich auf eine Mindestgeschwindigkeit einigen, die auf ALLEN Rechnern gleich sein soll.
    Dadurch läuft die Berechnung auf allen Rechnern in der gleichen Geschwindigkeit. Soweit klar?
    In Spielen spricht man von FPS (Frames Per Second) und durch die Trägheit des menschlichen Auges empfindet man ab 25 FPS eine ruckelfreie Bewegung.
    Damit Marsi´s Spiel auf allen Rechnern identisch schnell und flüssig läuft, will er die Framerate auf 25FPS festlegen, und realisiert das mit deiner "dynamischen" Sleepfunktion.

  • Wer steigt auf Windows 8 um?

    • Andy
    • 25. April 2012 um 19:29

    Wie üblich werde ich jede 2. BS-"Neuerung" übergehen....
    Von DOS auf Win95 (3.11 übersprungen), und Win 98, (ME/2000 übersprungen), jahrelang hochzufriedener XP-Nutzer, (Vista übersprungen), seit einigen Wochen Win7 (gewöhnungsbedürftig aber soweit OK) und selbstverständlich werde ich auch Win8 überspringen^^ (na schaumamal)
    Ich habe weder Lust noch die Zeit, und ausserdem viel besseres zu tun, als für Zehntausende Programmierer 2 Jahre lang Betatester zu spielen, damit nach dem x-ten "SERVICE(sic)-PACK" der Rechner halbwegs tut, was er soll....
    Dann lieber nicht "hip" aber mit funktionierendem System (hab ich schon erwähnt, dass ich auch ohne Ei-Fon und Konsorten überlebe^^)

    Zitat von BugFix

    Nun, mit einem Rechner der SSD hat, kann dir das total latte sein - schneller als schnell geht einfach nicht.

    Alles relativ, ich boote ziemlich selten, und dann auch nur, um die Systemupdates einzuspielen, also alle x Wochen mal. Tastendruck, nach 1 sec im standby, Tastendruck, nach 1 sec wieder wach, eine weitere Sekunde später im Inet. Booten? *lächel*
    Ich bekomm schon nen Hals, wenn ich morgens in der Firma auf den Rechner warten muss, um mich nach dem Hochfahren an 2-3 Sessions (XP, Win7, Server) anzumelden. Incl. jedesmal Username und Passwort und der ganze Dreck (4x genau, wer mitgezählt hat! )
    Spock und Capt´n Kirk wurden jedenfalls von der Enterprise noch NIE nach Username und Passwort gefragt, damit die Kiste auf WARP 8 geht :rofl:

  • Audio Output aufnehmen

    • Andy
    • 25. April 2012 um 19:07

    Hi,

    Zitat

    Das hängt möglicherweise auch von deiner Soundkarte ab.. Bei meinem alten Laptop klappt sowas zum Beispiel nicht, aber bei meinem PC schon.

    ggf den Sound-Ausgang per Kabel mit Line-In verbinden und dann dort aufnehmen.
    Üblicherweise macht man das aber über den Mixer, da kann man die einzelnen Ein/Ausgänge den Geräten zuordnen. Um z.B. Hintergrundmusik in TS-Gespräche einzubinden^^

  • Analyse eines Bildes auf schwarze/weiße Pixel

    • Andy
    • 24. April 2012 um 06:52

    Hi,

    Zitat

    Mir ist es jetzt möglich meinen Controller-Display am Computer zu designen und einfach auf den Controler zu Laden


    Hört sich gut an...
    Jedenfalls ist diese Aktion nicht zeitkritisch, da bist du mit den o.g. Vorschlägen gut bedient. Würdest du später ein Beispiel posten?

  • Analyse eines Bildes auf schwarze/weiße Pixel

    • Andy
    • 23. April 2012 um 19:36

    Hi,

    Zitat von YellowWeedSeed

    Die einfachste Lösung währe doch mit einer For-Scheife & PixelGetColor zu prüfen welche Farbe der Pixel hat.

    Nur wenn das Bild sichtbar auf dem Bildschirm ist, was man wiederum nicht braucht. Selbst wenn, wäre Pixelsearch dann die wesentlich schnellere Alternative...

    TimoIt, wozu brauchst du das?
    Ich hatte mal für ein Programm zur Auswertung von Faxen/SW-Bildern eine schnelle S/W-Suche in Assembler geschrieben, incl. Auswertung.
    Generell bringt der "Transfer" von Pixelkoordinaten in ein Array nichts ausser doppeltem Speicherplatzverbrauch und niedrige Arbeitsgeschwindigkeit. Die Koordinaten stehen doch schon im Bild, wieso dann noch in ein Array bringen?

    Ich würde alles beides, Suche und "Array" in einem machen:
    Leere Bitmap erstellen und komplett mit nach der zu suchenden Farbe füllen (GDI+).
    Struct mit DWORD´s erstellen an der Position der Bitmap (das ist das "Array")
    BitBlt mit Parameter SRCAND des Suchbildes auf die Bitmap.
    Dauert alles in allem einige hundertstel Millisekunden und die Pixel mit der gesuchten Farbe stehen dank der AND-Verknüpfung in der Struct (an der Position der Bitmap)
    Da eine Struct nichts anderes ist als ein Array, hat man alle gesuchten "Pixel" in kürzester Zeit gefunden.

  • Prozessproblem

    • Andy
    • 13. April 2012 um 21:04

    Hi,

    Zitat von autoBert

    ....Andy sagen würde: du suchst jemanden der dir deinen Arm aus der Sonne legt.

    hehe, genau...und (nicht nur) aus diesem Grunde, sondern weil ich auch zu 100% sicher bin, dass wieder mal irgendeine Gülle verzapft werden soll....vote for close, denn das "Problem" ist Scripttechnisch gelöst!

  • EMail mit Bild als HTML?

    • Andy
    • 13. April 2012 um 17:02

    Hi, wieso Irfanview, wenn GDI auch Bilder verkleinern kann?

  • Pfad zur Datei, die gerade am Bildschirm angezeigt wird auslesen

    • Andy
    • 13. April 2012 um 16:37

    Hi,

    Offene Dateihandles findet man mit den von Aspirinjunkie und BugFix beschriebenen Einschränkungen per WMI, AutoIt Scriptomatic erstellt z.B. folgendes Script:

    Spoiler anzeigen
    [autoit]

    ; Generated by AutoIt Scriptomatic

    [/autoit] [autoit][/autoit] [autoit]

    $wbemFlagReturnImmediately = 0x10
    $wbemFlagForwardOnly = 0x20
    $colItems = ""
    $strComputer = "localhost"

    [/autoit] [autoit][/autoit] [autoit]

    $Output=""
    $Output = $Output & "Computer: " & $strComputer & @CRLF
    $Output = $Output & "==========================================" & @CRLF
    $objWMIService = ObjGet("winmgmts:\\" & $strComputer & "\root\CIMV2")
    $colItems = $objWMIService.ExecQuery("SELECT * FROM Win32_FileSpecification", "WQL", _
    $wbemFlagReturnImmediately + $wbemFlagForwardOnly)

    [/autoit] [autoit][/autoit] [autoit]

    If IsObj($colItems) then
    For $objItem In $colItems
    $Output = $Output & "Attributes: " & $objItem.Attributes & @CRLF
    $Output = $Output & "Caption: " & $objItem.Caption & @CRLF
    $Output = $Output & "CheckID: " & $objItem.CheckID & @CRLF
    $Output = $Output & "CheckMode: " & $objItem.CheckMode & @CRLF
    $Output = $Output & "CheckSum: " & $objItem.CheckSum & @CRLF
    $Output = $Output & "CRC1: " & $objItem.CRC1 & @CRLF
    $Output = $Output & "CRC2: " & $objItem.CRC2 & @CRLF
    $Output = $Output & "CreateTimeStamp: " & WMIDateStringToDate($objItem.CreateTimeStamp) & @CRLF
    $Output = $Output & "Description: " & $objItem.Description & @CRLF
    $Output = $Output & "FileID: " & $objItem.FileID & @CRLF
    $Output = $Output & "FileSize: " & $objItem.FileSize & @CRLF
    $Output = $Output & "Language: " & $objItem.Language & @CRLF
    $Output = $Output & "MD5Checksum: " & $objItem.MD5Checksum & @CRLF
    $Output = $Output & "Name: " & $objItem.Name & @CRLF
    $Output = $Output & "Sequence: " & $objItem.Sequence & @CRLF
    $Output = $Output & "SoftwareElementID: " & $objItem.SoftwareElementID & @CRLF
    $Output = $Output & "SoftwareElementState: " & $objItem.SoftwareElementState & @CRLF
    $Output = $Output & "TargetOperatingSystem: " & $objItem.TargetOperatingSystem & @CRLF
    $Output = $Output & "Version: " & $objItem.Version & @CRLF
    if Msgbox(1,"WMI Output",$Output) = 2 then ExitLoop
    $Output=""
    Next
    Else
    Msgbox(0,"WMI Output","No WMI Objects Found for class: " & "Win32_FileSpecification" )
    Endif

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func WMIDateStringToDate($dtmDate)

    [/autoit] [autoit][/autoit] [autoit]

    Return (StringMid($dtmDate, 5, 2) & "/" & _
    StringMid($dtmDate, 7, 2) & "/" & StringLeft($dtmDate, 4) _
    & " " & StringMid($dtmDate, 9, 2) & ":" & StringMid($dtmDate, 11, 2) & ":" & StringMid($dtmDate,13, 2))
    EndFunc

    [/autoit]


    Bissl umbauen bzw auf eigene Bedürfnisse anpassen sollte man können^^

  • Zwei Fragen: 1.) Kollision Ellipse(Kugel) mit Rechteck, 2.) FPS

    • Andy
    • 10. April 2012 um 08:31

    Hi,

    Zitat

    Die Kollision des Balles mit den Wänden und dem Schläger funktioniert, leider aber nicht die des Balles mit den Ziegelsteinen.

    Einfach bei der Kollisionsabfrage die Breite und Höhe der Steine größer machen, so daß keine "Lücke" entsteht.

    [autoit]

    And $ball[0] <= $bricks[$i][0] + $brick_width + 5 Then

    [/autoit]

    Die Größen können ruhig überlappen, das führt dann dazu, dass bei einem Treffer der "Lücke" beide Steine verschwinden.

    Zitat

    Vielleicht manuell die FPS senken? Hm...

    sleep(25) beschränkt die FPS auf 40, egal wie schnell der Code ist. Ich würde aber per adlib eine Funktion einbauen, die den Parameter für Sleep() dynamisch anpasst. Die FPS sind eigendlich egal, solange sich die Geschwindigkeit des Balles nicht ungewollt ändert.

  • GDIPlus Jpg`s/gif`s übermalen

    • Andy
    • 9. April 2012 um 20:46

    Hi,
    wie schon von name22 gesagt, lies dir durch, was du zu diesem Thema bekommen kannst, ansonsten wird das nix...
    Du hast weder jemals ein grafisches Spiel geschrieben noch irgendeine Ahnung von Grafik-Programmierung, also eigne dir die Vorraussetzungen an und lerne laufen, bevor du rennen willst!

    Zitat

    sicher das es dan nicht anfängt zu hängen? Nicht das ich da jz zuviel hoffnung reinstecke, das es alles so geht wie ich will & es dan nachher doch nicht tut

    Es gibt massig Spiele in AutoIt, die nicht "hängen", obwohl AutoIt alles andere als eine "schnelle" Sprache ist. Das liegt einfach am Knowhow und Skill der Programmierer.

  • ManageIncludes - Includeorganisation in SciTE mit Lua-Skript

    • Andy
    • 9. April 2012 um 13:52

    Hi,
    ich vermute mal, dass nicht wenige von der "Installation" abgeschreckt werden!
    Ein Installer würde das Procedere wesentlich vereinfachen....

  • Frage zu dll

    • Andy
    • 8. April 2012 um 09:12

    um die Adresse einer Funktion in einer Dll zu erhalten, benutzt man GetProcAddress()
    Statt "Funktionsname" kann man den DllCall auch mit dieser Adresse aufrufen

  • Sichtbar gemachte Fenster (@SW_SHOW) nicht bedienbar

    • Andy
    • 7. April 2012 um 15:06
    [autoit]

    While 1
    if winactive("Test Test Test") then guisetstate(@sw_show)
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit]


    und

    [autoit]

    winactivate("Test Test Test")

    [/autoit]
  • Sichtbar gemachte Fenster (@SW_SHOW) nicht bedienbar

    • Andy
    • 7. April 2012 um 14:38

    mit

    Spoiler anzeigen
    [autoit]

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Test Test Test", 230, 118, 192, 124)
    $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49)
    guisetstate(@sw_show)
    guisetstate(@SW_MINIMIZE)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit]

    und

    [autoit]

    winactivate("Test Test Test")

    [/autoit]

    gehts

  • Sichtbar gemachte Fenster (@SW_SHOW) nicht bedienbar

    • Andy
    • 7. April 2012 um 13:48

    Hi,
    wie soll denn auch eine GUI bedienbar sein, wenn GuiSetState() fehlt?

    Spoiler anzeigen
    [autoit]


    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    $Form1 = GUICreate("Test Test Test", 230, 118, 192, 124)
    $Button1 = GUICtrlCreateButton("Klick mich!", 60, 34, 125, 49, $WS_GROUP)
    guisetstate()

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button1
    MsgBox(0,"","Erfolg")
    EndSwitch
    WEnd

    [/autoit]
    Zitat

    Hast du dir die Beispiele und meinen Problemschilderungs-Text angeschaut? hust

    ja, hat er, und dir auch die Lösung genannt,aber du warst nicht in der Lage das umzusetzen *hust hust hust*

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™