GDI+ Background, SetClip, Performance

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Bluespide.

    GDI+ Background, SetClip, Performance

    Danke @FreakJNS für die bisherigen Tuts/Posts zum Thema GDI^^

    Alsoooo,..
    Ich hab mich mal seit gestern Abend hingesetzt und die Nacht durch GDI getestet.
    Zeichnen, Kollision, Bilder, Texturen etc alles kein Problem.

    Aber die Performance hängt doch ein bisschen hinter her :(

    Ich habe den Grund auf das füllen des Hintergrundes reduzieren können.
    Hier 3 Tests:

    VB.NET-Quellcode

    1. .FillRectangle(Brushes.Black, _AusenAbstand, _AusenAbstand, Me.Width - _AusenAbstand, Me.Height - _AusenAbstand)
    2. 800x600 ~250FPS
    3. 1680x1050 ~100FPS


    VB.NET-Quellcode

    1. .FillRectangle(New TextureBrush(_Background, Drawing2D.WrapMode.Tile), _AusenAbstand, _AusenAbstand, Me.Width - _AusenAbstand, Me.Height - _AusenAbstand)
    2. 800x600 ~26FPS
    3. 1680x1050 ~7FPS


    VB.NET-Quellcode

    1. .DrawImage(_Background, _AusenAbstand, _AusenAbstand, Me.Width - _AusenAbstand, Me.Height - _AusenAbstand)
    2. 800x600 ~50FPS
    3. 1680x1050 ~20FPS


    und das auf einem i5(4x3,2GHz) bei ca 30% Auslastung :huh:


    das GraphicsObject kommt direkt von der Form

    VB.NET-Quellcode

    1. Private Sub paintuu(sender As Object, e As PaintEventArgs) Handles Me.Paint
    2. With e.Graphics
    3. ..


    aktualisiert wird in einer while(_run) Schleife also keine Timer usw und Daten werden in extra Threads berechnet.



    Nun hab ich doch noch ein paar Fragen zu GDI.
    • Welche ist die schnellste Methode einen "Hintergrund" zu zeichnen
    • Wie benutzt man SetClip(), GetClip()
    • Und wie ist die Herangehensweise um nur neue Daten zeichnen ?
    • Lohnt es sich GDI zu lernen oder sollte ich direkt zu WPF/DX/XNA umsteigen


    Ich sag dann mal Gute Nacht und Danke im Voraus <3

    Edit by ~blaze~
    *Thema aus Tipps&Tricks verschoben*
    EDIT:
    @~blaze~ sry da war ich wohl schon am schlafen ^^

    hab zudem mit der Methode e.Clear(color) rumprobiert und die geht noch mal um einiges schneller.
    aber iwie kommt mir GDI doch bissl langsam vor.

    Heute hab ich mich mal hingetzt und keine Schleife painten lassen sondern immer nur Me.Invalidate aufgerufen wenn Mouse/Tastatur/Game -Ereignisse stattfanden.
    Ob das nun besser läuft kann ich nich wirklich sagen :sleeping:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Pantsuu“ ()

    Weis keiner eine Antowort bzw hat nen Tipp für mich? Freue mich über jede Antwort ^^

    Und nach bisschen rumprobieren ist mir noch etwas eingefallen was mich interessieren würde.

    ist .DrawImage schneller als texture?

    Edit kommt später, bin grad unterwegesn^-^
    Du machst vermutlich tatsächlich nichts Falsch, GDI+ ist nunmal nicht HW beschleunigt(GDI schon). Aber es gibt noch einen Trick womit man etwas rausholen kann: Nur das neu zeichnen, was sich verändert hat msdn.microsoft.com/de-de/library/8dtk06x2(v=vs.110).aspx
    Ansonsten kann man mit SetClip den bereich eingrenzen in dem gezeichnet werden soll(nicht dasselbe wie mit Invalidate, sondern nur um ein Bild, zu begrenzen - ergibt z.B. Sinn bei UI wenn Controls über ein Parent-Control raus ragen wird eiinfach abgeschnitten)

    Es lohnt sich aufjedenfall GDI zu lernen, aber für Games wirst du früher oder später umsteigen müssen. Aber da empfielt sich sowieso am besten gleich entsprechend eine Architektur aufzubauen, sodass es dem Spiel egal ist mit was du zeichnest und du den Renderer einfach austauschen kannst.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Ich würde anstatt im OnPaint alles zu zeichnen erst den Frame auf eine Bitmap zeichnen und dann auf die Form BitBlt'en. Außerdem ist, wie jvbsl gesagt hat, wichtig, dass du nur den Teil neu zeichnest, welcher verändert wird.

    Ist das Hintergrundbild eigentlich statisch oder bewegt es sich? Ist es statisch, kannst du es auch direkt auf die Ergebnis-Bitmap BitBlt'en (vor allem Anderen), dann geht das sicher etwas schneller.