Schneller als GDI+?

  • Hallo com,

    ich habe folgendes Problem ich habe ein Bild von einer Datei geladen (_GDIPlus_ImageLoadFromFile) und mir die einzelnen Stücke aus den Bild herrausgeschnitten (_GDIPlus_BitmapCloneArea) und dann das herrausgeschnittene öfters in meiner GUI gemalt. Wenn ich das herrausgeschnittene ca. 200 in einer GUI male laggt es doch etwas. Gibt es eine andere möglichkeit genau das gleich zu machen nur etwas schneller. Das herrausgeschnittene ist 16x16 groß.

    Mfg
    blacky94

    Einmal editiert, zuletzt von blacky94 (23. November 2011 um 21:37)

  • Ich möchte gerne das sich der Kreis schneller bewegt aber der Kreis muss immer nur einen Pixel nach rechts.

    [autoit]

    #include <GDIPlus.au3>
    #include <GuiConstants.au3>
    #include <Misc.au3>

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

    $hGui = GUICreate("",1000,500)
    GUISetState()

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

    $o = 0

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

    _GDIPlus_Startup()
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hImage = _GDIPlus_ImageLoadFromFile("wappen.png")
    $hBitmap = _GDIPlus_BitmapCloneArea($hImage,0,0,30,30)

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

    For $i = 0 To 32
    For $x = 0 To 15
    _GDIPlus_GraphicsDrawImage($hGraphics,$hBitmap,30*$i,30*$x)
    Next
    Next

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

    _GDIPlus_GraphicsDrawImage($hGraphics,$hBitmap,0,0)

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

    While 1
    $msg = GUIGetMsg()
    Select
    Case $GUI_EVENT_CLOSE = $msg
    _Exit()
    Case _IsPressed("27")
    $o = $o +1
    _GDIDraw_New()
    EndSelect
    WEnd

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

    Func _Exit()
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc

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

    Func _GDIDraw_New()
    _GDIPlus_GraphicsClear($hGraphics)
    For $i = 0 To 32
    For $x = 0 To 15
    _GDIPlus_GraphicsDrawImage($hGraphics,$hBitmap,30*$i,30*$x)
    Next
    Next
    _GDIPlus_GraphicsDrawEllipse($hGraphics,0+$o,0,10,10)
    EndFunc

    [/autoit]
  • Wenn du die Pfeiltaste rechts drückst wie viel Zeit benötigt ungefähr der Kreis um auf die anderen Seite der GUI zu gelangen :?
    Habe es auf meinem Netbook getestet.

  • Achso, ok mein Fehler, ich hab dir hier ein Script gemacht wo es nicht mehr lagt. Nun ist allerdings das Problem: Man kann nicht mehr sehen ob es funktioniert, weil es nicht mehr flimmert^^ xD

    also hier der Code:

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GuiConstants.au3>
    #include <Misc.au3>

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

    $hGui = GUICreate("",1000,500)
    GUISetState()

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

    $o = 0

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

    _GDIPlus_Startup()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
    $hImage = _GDIPlus_ImageLoadFromFile("wappen.png")
    $hBitmap = _GDIPlus_BitmapCreateFromGraphics(1000, 500, $hGraphic)
    $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
    For $i = 0 To 32
    For $x = 0 To 15
    _GDIPlus_GraphicsDrawImage($hBuffer,$hImage,30*$i,30*$x)
    Next
    Next
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, 1000, 500)
    While 1
    $msg = GUIGetMsg()
    Select
    Case $GUI_EVENT_CLOSE = $msg
    _Exit()
    Case _IsPressed("27")
    $o = $o +1
    _GDIDraw_New()
    EndSelect
    WEnd

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

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

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

    Func _GDIDraw_New()
    For $i = 0 To 32
    For $x = 0 To 15
    _GDIPlus_GraphicsDrawImage($hBuffer,$hImage,30*$i,30*$x)
    Next
    Next
    ;_GDIPlus_GraphicsDrawEllipse($hGraphics,0+$o,0,10,10)
    EndFunc

    [/autoit]


    Das Zauberwort heißt: Buffer
    Du zeichnest also quasi auf ein Bild und lässt es dann anzeigen, damit wird das alte erscheinungsbild nur übergezeichnet und nicht weggemacht und neu gezeichnet ( wie es vorher war ).

    mfg
    Hauke


  • Hallo Hauke,

    danke für deine Antwort nur leider ist dies nicht der Weg zur lösung meines Problems, trotzdem vielen dank ;o. Mein Problem ist nicht das es flackert sondern das er es zu langsam nachmalt. Daher bewegt sich der Kreis nur sehr langsam nach rechts bei meinem Beispiel das ich oben angegeben habe. Also er braucht sehr lange bis er den rechten Rand der GUI erreicht hat.

  • Dann mach das doch so wie ich bei meinem RPG. Teil die ganze "Map" in bereiche ein ( per array ) und lass nur die neu malen über die der Ball gerollt ist, somit geht das ganze schneller.

    mfg
    Hauke


    Okay werde ich machen.