GuiCtrlCreateGraphic "beschleunigen"

  • Hallo zusammen.
    Wir machen gerade ein kleines Spiel mit Autoit. (Xonix, falls es jemand kennt) Es ist auch schon fast fertig, aber es gibt ein Problem mit der Geschwindigkeit von GuiCtrlCreateGraphic. Wir wollten das Spiel bewusst ohne GDI-Plus o.ä. machen, es soll halt "simple" sein.
    Es müssen verschiedene Bereiche schwarz ausgefüllt werden... Man hat gewonnen, sobald man mehr als 70% des Bildschirms schwarz ausgefüllt hat. Der Ball (Die Bälle) dürfen einen dabei nicht treffen.
    Anbei ist ein Screenshot, der gelbe Bereich in ihm soll jetzt vom Programm ausgefüllt werden. Funktioniert auch prima, aber je größer der Bereich, desto langsamer wird das Ausfüllen nach einer Weile.

    Weiß einer wie man dies beschleunigen könnte, ohne GDIPLUS o.ä. zu benutzen...?

    Hier noch ein kleines Testprogramm, was jetzt die gesamte Gui ausfüllt. Das passiert so wie im richtigen Spiel, nur dass halt nicht alle werte im $array[][] auf 0 stehen.
    Man sieht deutlich wie die Geschwindigkeit nach einer Zeit sehr langsam wird.

    Spoiler anzeigen
    [autoit]

    #include
    #include
    #include
    #include

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

    Global $array[52][52]

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

    $Form1 = GUICreate("test", 521, 521, 192, 124)
    GUISetState(@SW_SHOW)

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

    _mach()

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Sleep(50)
    Wend

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

    Func _mach()
    For $x = 0 To 51
    For $y = 0 To 51
    $array[$x][$y] = 0
    Next
    Next

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

    For $x = 0 To 51
    For $y = 0 To 51
    if $array[$x][$y] = 0 Then
    GUICtrlCreateGraphic($x*10,$y*10,10,10)
    GUICtrlSetBkColor(-1,0x000000)
    EndIf
    Next
    Next
    EndFunc

    [/autoit]
  • Lösung :

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <array.au3>
    Global $array[52][52]

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

    $Form1 = GUICreate("test", 521, 521, 192, 124)
    GUISetState(@SW_SHOW)
    GUISetState(@SW_LOCK,$Form1)
    _mach()
    GUISetState(@SW_UNLOCK,$Form1)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    Sleep(50)
    Wend

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

    Func _mach()
    For $x = 0 To 51
    For $y = 0 To 51
    $array[$x][$y] = 0
    Next
    Next
    For $x = 0 To 51
    For $y = 0 To 51
    if $array[$x][$y] = 0 Then
    GUICtrlCreateGraphic($x*10,$y*10,10,10)
    GUICtrlSetBkColor(-1,0x000000)
    EndIf
    Next
    Next
    EndFunc

    [/autoit]

    Ich kann zwar kein GDI Plus oder irgendwas mit Graphicen in Autoit aber ich denke es lag daran das er immer die gesamte schwarze Fläche neuzeichnen musste nach dem eine neue erstellt wurde.Mit meinem Code verändert sich das GUI nicht bis alle erforderlichen Flächen gezeichnet wurden so dass sie alle in einem aufs GUI gezeichnet werden können. (Nur eine Theorie xD)


    MfG Sumsum ;)

    3 Mal editiert, zuletzt von sumsum (12. Februar 2011 um 11:19)