autoit ist zu langsam

  • mach mir grad ein spiel und die figur bewegt sich in zeitlupe obwohl ich das sleep sogar schon entfernt hab wie krieg ich das schneller ?

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    $iWidth = 800
    $iHeight = 500
    $picture_player1 = 0

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

    $sfigur_name_1 = ""

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

    $ixplayer1 = 50
    $iyplayer1 = 455
    $ijump = 0

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

    Global $Player[21]

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

    _GDIPlus_Startup()
    For $iplayer_loading = 0 To 20
    $Player[$iplayer_loading] = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Bilder\figur_" & $iplayer_loading & ".gif")
    Next
    $schliessen = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Bilder\schliessen.gif")
    $level1 = _GDIPlus_ImageLoadFromFile(@ScriptDir & "\Spielobjekte\Probe.png")
    $hWnd = GUICreate("The War of the stick figures", $iWidth, $iHeight,@DesktopWidth/2 - $iWidth /2,@DesktopHeight/2 - $iHeight/2,$WS_POPUP)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    GUISetState()

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

    While 1
    $maus = GUIGetCursorInfo()
    If Not($maus = "") Then
    If _IsPressed(01) And $maus[0] >= $iWidth - 25 And $maus[0] >= $iWidth -24 And $maus[1] <= $iHeight And $maus[1] <= $iHeight Then _Exit()
    EndIf
    _GDIPlus_GraphicsDrawImageRect($hbuffer,$Level1,0,0,$iWidth,$iHeight)
    _GDIPlus_GraphicsDrawImageRect($hbuffer,$Player[$picture_player1],$ixplayer1,$iyplayer1,25,30)
    _GDIPlus_GraphicsDrawImageRect($hbuffer,$schliessen,$iWidth - 24,0,25,25)
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, $iWidth, $iHeight)
    If _IsPressed(26) Then
    AdlibRegister("_player1_jump",10)
    EndIf
    If _IsPressed(27) Then
    $picture_player1 = $picture_player1 +1
    If $picture_player1 >= 9 Then $picture_player1 = 1
    $ixplayer1 = $ixplayer1 + 5
    EndIf
    If _IsPressed(25) Then
    $ixplayer1 = $ixplayer1 - 5
    EndIf
    WEnd

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

    Func _Exit()
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

    Func _player1_jump()
    $ijump = $ijump + 1
    If $ijump <= 7 Then
    $iyplayer1 = $iyplayer1 - 5
    ElseIf $ijump <= 14 Then
    $iyplayer1 = $iyplayer1 +5
    ElseIf $ijump >= 14 Then
    AdlibUnRegister("_player1_jump")
    $ijump = 0
    EndIf
    EndFunc

    [/autoit]
  • Wieso beschwert ihr euch darüber, dass AutoIt langsam ist? Es hat hier niemand etwas anderes behauptet. Im Fall von AutoIt geht eben komfort auf Kosten der Geschwindigkeit. Wenn ihr es nicht schafft eure Scripte effizient genug zu gestalten, so dass sie einigermaßen schnell laufen, dann solltet ihr euch vielleicht eine andere Sprache aneignen. Ich hab es auch geschafft meine bisherigen Spiele mit GDI+ einigermaßen schnell ablaufen zu lassen (ca. 30 FPS). Ihr müsst einfach nur überprüfen welche Befehle lange dauern und diese dann anders verwenden oder auch ersetzen. So etwas sollte man selbst als Hobby AutoItler hinkriegen.

    • Offizieller Beitrag

    Ja, das ist halt der gravierende Unterschied zwischen: ein Skript hinklatschen und Programmieren.
    Befehle aneinanderreihen, dass das gewünschte Verhalten auftritt reicht halt nicht. Jedenfalls nicht, wenn der Faktor Zeit eine Rolle spielt. Da sollte man schon vor Beginn gründlich analysieren, was wann passieren soll. (Stichwort 'Softwareengeneering')
    Ganz nebenbei ist ein optimiertes Skript normalerweise auch sehr gut lesbar. ;)

  • mach mir grad ein spiel und die figur bewegt sich in zeitlupe obwohl ich das sleep sogar schon entfernt hab wie krieg ich das schneller ?

    in dem du deine Funcs optimierst. Das AutoIt trotz Interpretierender Sprache nicht zu langsam für Spiele ist kannst du z.B.:an AutoIteroids vom GDI-Meister UEZ erkennen, einfach einmal die SuFu oderGoogle benutzen.l

    Einmal editiert, zuletzt von autoBert (15. Juni 2011 um 20:57)

  • Von der Source bekommt man ja Kopfweh !!!
    Guck dir einige Games hier an - Die laufen alle > 10 - 20 FPS ;)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal


  • Mein neuestes Projekt läuft sogar mit ca. 60 FPS :P. Also kann ja wohl kaum AutoIt daran Schuld sein. ^^

    Da hast du aber jede einzelne Berechnng optimimiert, ja ( @Manuel) auch gute Mathe- und Physikkentnisse sind wichtig,

    mfg autoBert

  • Ich meine das

    [autoit]

    AdlibRegister()

    [/autoit]

    ist total zeitunnütz und man könnte das durch ein aufrufen der Funktion lösen ...

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Mein TD läuft mit unmengen Abfragen, Vielen Bewegten Bildern und allem möglichen sonstigen Mist und Anzeige der Gemwerte mit 20-90 FPS (je nachdem wie viele Gegner auf dem Feld sind)

    Bei einer Hand voll Gems und keinem Gegner sind 90 FPS Standard. (Einfach mal das Sleep auf 90 einstellen und das Wunder begutachten)
    Bei einigen Gems und ca. 60 Gegnern sind es dann noch 20FPS. Immer noch schnell genug um es ordentlich spielen zu können.

    Es gibt 3 einfache Möglichkeiten mehr Tempo rauszuholen.

    1: Die "Schrittgröße" erhöhen.
    - Wenn ein Gegenstand 2Mal so schnell ist springt er halt 2px pro Frame statt nur einen.
    - Sollte aber nur bis vllt 5px/Frame genutzt werden, weil das sonst abgehackt aussieht.

    2: Auflösung verringern.
    - Angenommen man halbiert die Auflösung (dadurch geht auch das Zeichnen wesentlich schneller) kann man die Schrittgröße halbieren. Anschließendes Skalieren um den Faktor 2 verdoppelt so die Geschwindigkeit.
    - Nachteil ist: auch hier sollte man keine großen Sprünge machen. Durch den niedrigeren Aufwand beim Zeichnen spaart man sich aber einiges an CPU.

    3: Schnellere Funktionen nutzen.
    - z.B. ein DrawImagerect dauert um ein vielfaches länger als ein BitBlt. (Für Transparenz AlphaBlend nutzen)
    - Das Adlib Register und Unregister frisst unmengen wertvolle Zeit. Optimal ist es in der Hauptschleife die Reaktion auf die Abfrage (in dem Fall das _IsPressed(26)) direkt vor zu nehmen.

    sonstiges:
    Optimierungen helfen meist auch noch ein Mal ordentlich.
    z.B. wenn man die gleiche Funktion (nur mal angenommen _IsPressed('01')) mehrfach braucht kann man den Wert zu beginn der Schleife holen und in einer Variable speichern. Das nutzen der Variable ist dann viel schneller als den Wert erneut auszulesen.


    .: Edit: Lad bitte mal die Bilder in ienem Rar Archiv hoch :.

    lg
    Mars(i)

  • Zitat

    - z.B. ein DrawImagerect dauert um ein vielfaches länger als ein BitBlt. (Für Transparenz AlphaBlend nutzen)

    Da kann ich nur zustimmen, wenn du mit den WinApi Funktionen arbeitest und DCs anstat die normale Grafic-Bitmap-Buffer Methode geht es bis zu 3 mal schneller.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Es waren eine Hand voll Redundanzen im Archiv. Deshalb ist es doppelt gepackt^^

    Habe das Sktipt mal etwas abgeändert und mit Bildern versehen. Vllt hilft es ja was.
    (Sooo langsam ist es garnicht. wenn man den Sleep auf 0 setzt geht das Männchen schon relativ gut ab)

    lg
    Mars(i)

  • hab das problem nicht mehr musste einfach die qualität des hintergundbildes extrem zurückschrauben jezt läuft alles flüssig udn mien problem war nicht die bewegungsgeschwindikeit sondern das er die spielgifur nur alle 5 sekunden aktualisiert hat

  • AutoIt ist natürlich sehr langsam, allerdings braucht man für Automatisierungen und kleine Tools auch keine hohe Geschwindigkeit.
    Auch wenn es oft dazu benutzt wird, ist AutoIt nicht für Spiele gedacht.

    Ansonsten hilft nichts so gut, wie effektive Programmierung. Auch ohne inline-Assembler und eigene DLLs erreicht man gute Geschwindigkeiten. Einfach mal selber ausprobieren und messen.

  • Eigentlich war die Ausgangsfrage ja wie das Script schneller gemacht werden kann.
    Die Überschrift ist vielleicht etwas ungünstig aber mein Gott ....

    Zum Thema: Für GDI+ sollte man den GUIOnEventMode verwenden (zumindest wurde mir das so gelernt).