Geschwindigkeitsunterschiede

  • Hallo Leute

    ich hab mir ein kleines GDI+ skript gebastelt, was Regentropfen darstellen soll, aber wenn ich es jetzt ausführe ist es erst schnell, dann wird es langsamer, wenn ich aber die Maus dann wieder bewege, dann wird es wieder schneller.

    Ich wollte euch fragen, warum das so ist.

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    $fach = 0
    Dim $gegner[80][2]
    For $j = 0 To UBound($gegner) - 1 Step 1
    $gegner[$j][0] = -100
    Next
    OnAutoItExitRegister("_EXIT")
    $Gui = GUICreate("Regen", 500, 500, 100, 100)
    _GDIPlus_Startup()
    $brushSchwarz = _GDIPlus_BrushCreateSolid(0xFFABCDEF)
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    GUISetState()
    AdlibRegister("_gegnerSpawn", 500)
    Do
    For $m = 0 To UBound($gegner) - 1 Step 1
    If $gegner[$m][1] >= 480 Then $gegner[$m][1] = 0
    Next
    For $k = 0 To UBound($gegner) - 1 Step 1
    $gegner[$k][1] += 2
    Next
    $msg = GUIGetMsg()
    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss)
    For $i = 0 To UBound($gegner) - 1 Step 1
    _GDIPlus_GraphicsFillEllipse($buffer, $gegner[$i][0], $gegner[$i][1], 20, 20, $brushSchwarz)
    Next
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500)
    Until $msg = $GUI_EVENT_CLOSE
    Func _EXIT()
    _GDIPlus_BrushDispose($brushSchwarz)
    _GDIPlus_BrushDispose($brushWeiss)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    EndFunc ;==>_EXIT
    Func _gegnerSpawn()
    If $fach <= UBound($gegner) - 2 Then
    $gegner[$fach][0] = Random(0, 480, 1)
    $fach += 1
    $gegner[$fach][1] = 0
    EndIf
    EndFunc ;==>_gegnerSpawn

    [/autoit]

    Danke
    DFPWare

  • GUIGetMsg passt seine Ausführungszeit (bzw. die Pausezeit) an die Benutzereingabe an. Wird also die Maus über deinem Fenster bewegt oder Buchstaben eingegeben, wartet es nicht so lange.
    Du solltest also den GIUOnEvent-Modus verwenden.

  • Ich hab das noch nie so gemacht, auf jeden Fall funktioniert es so nicht:

    Spoiler anzeigen
    [autoit]

    #include <GuiConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    GUISetOnEvent($GUI_EVENT_CLOSE,"_ExitMode")
    $fach = 0
    Dim $gegner[80][2]
    For $j = 0 To UBound($gegner) - 1 Step 1
    $gegner[$j][0] = -100
    Next
    OnAutoItExitRegister("_EXIT")
    $Gui = GUICreate("Regen", 500, 500, 100, 100)
    _GDIPlus_Startup()
    $brushSchwarz = _GDIPlus_BrushCreateSolid(0xFFABCDEF)
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    GUISetState()
    AdlibRegister("_gegnerSpawn", 500)
    Do
    For $m = 0 To UBound($gegner) - 1 Step 1
    If $gegner[$m][1] >= 480 Then $gegner[$m][1] = 0
    Next
    For $k = 0 To UBound($gegner) - 1 Step 1
    $gegner[$k][1] += 2
    Next
    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss)
    For $i = 0 To UBound($gegner) - 1 Step 1
    _GDIPlus_GraphicsFillEllipse($buffer, $gegner[$i][0], $gegner[$i][1], 20, 20, $brushSchwarz)
    Next
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500)
    Until Not 1
    Func _EXIT()
    _GDIPlus_BrushDispose($brushSchwarz)
    _GDIPlus_BrushDispose($brushWeiss)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    EndFunc ;==>_EXIT
    Func _gegnerSpawn()
    If $fach <= UBound($gegner) - 2 Then
    $gegner[$fach][0] = Random(0, 480, 1)
    $fach += 1
    $gegner[$fach][1] = 0
    EndIf
    EndFunc ;==>_gegnerSpawn
    Func _ExitMode()
    Exit
    EndFunc

    [/autoit]
  • Das sollte eigentlich recht einfach zu implementieren sein:

    Spoiler anzeigen
    [autoit]


    #include <GuiConstants.au3>
    #include <GDIPlus.au3>
    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    $fach = 0
    Dim $gegner[80][2]
    For $j = 0 To UBound($gegner) - 1 Step 1
    $gegner[$j][0] = -100
    Next
    OnAutoItExitRegister("_EXIT")
    $Gui = GUICreate("Regen", 500, 500, 100, 100)
    _GDIPlus_Startup()
    $brushSchwarz = _GDIPlus_BrushCreateSolid(0xFFABCDEF)
    $brushWeiss = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    $graphic = _GDIPlus_GraphicsCreateFromHWND($Gui)
    $bitmap = _GDIPlus_BitmapCreateFromGraphics(500, 500, $graphic)
    $buffer = _GDIPlus_ImageGetGraphicsContext($bitmap)
    _GDIPlus_GraphicsSetSmoothingMode($buffer, 2)
    GUISetState()
    GUISetOnEvent(-3, "_Exit")
    AdlibRegister("_gegnerSpawn", 500)
    Do
    For $m = 0 To UBound($gegner) - 1 Step 1
    If $gegner[$m][1] >= 480 Then $gegner[$m][1] = 0
    Next
    For $k = 0 To UBound($gegner) - 1 Step 1
    $gegner[$k][1] += 2
    Next
    $msg = GUIGetMsg()
    _GDIPlus_GraphicsFillRect($buffer, 0, 0, 500, 500, $brushWeiss)
    For $i = 0 To UBound($gegner) - 1 Step 1
    _GDIPlus_GraphicsFillEllipse($buffer, $gegner[$i][0], $gegner[$i][1], 20, 20, $brushSchwarz)
    Next
    _GDIPlus_GraphicsDrawImageRect($graphic, $bitmap, 0, 0, 500, 500)
    Until Not Sleep(20)
    Func _EXIT()
    _GDIPlus_BrushDispose($brushSchwarz)
    _GDIPlus_BrushDispose($brushWeiss)
    _GDIPlus_GraphicsDispose($buffer)
    _GDIPlus_GraphicsDispose($graphic)
    _GDIPlus_Shutdown()
    GUIDelete($Gui)
    Exit
    EndFunc ;==>_EXIT
    Func _gegnerSpawn()
    If $fach <= UBound($gegner) - 2 Then
    $gegner[$fach][0] = Random(0, 480, 1)
    $fach += 1
    $gegner[$fach][1] = 0
    EndIf
    EndFunc ;==>_gegnerSpawn

    [/autoit]

    Gruß,
    UEZ ;)

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯