Hilfe zu Programm in Entwicklung (GDI)?

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von X-Zat.

    Hilfe zu Programm in Entwicklung (GDI)?

    Hallo Community!

    Ich bin im Moment dabei, ein Programm zum Verwalten von Spielen (in der Richtung von "Game Manager" und "Happy Gaming", die in diesem Forum schon vorgestellt worden sind) zu programmieren.

    Das ganze System habe ich recht dynamisch aufgebaut, sodass Fehler in den Grundlagen (z.B. Zeichnen, Input-Fehler) nicht zum Absturz führen und behoben werden. Das Programm wird mittels GDI dargestellt und animiert, eigene Grafiken habe ich in den Ressources.

    Nur habe ich ein kleines Problem: Das ganze ist verdammt unperformant - Auf meinem Rechner (CPU: 2x 2,7 Ghz; GraKa: nVidia GeForce 9600 GT 512 MB; RAM: 3 GB; OS: Windows 7 Professional 64 Bit) habe ich eine teils 60%ige Auslastung (normale Auslastung im normalen Betrieb liegt bei ca. 10-15%).
    Das ganze schaut zwar für eine blutige Alpha schon ganz sche aus, aber ich habe keine Ahnung, wie ich das verbessern kann.

    Ich arbeite mit DoubleBuffer = True und flackern tut auch nichts. Habt ihr eine Ahnung, wie ich mit GDI möglichst CPU-schonend programmieren kann? Wie würdet ihr das anstellen? Würdet ihr alles im OnPaint-Event zeichnen lassen? Würdet ihr das beim OnPaint-Event erstellte Graphics-Object einer fremden Klasse zur eigenen Berechnung übergeben oder dort neu instanzieren?

    Falls ihr euch das Programm schoneinmal anschauen wollt, kann ich es euch auf Wunsch gern in den Anhang packen. Und wenn ihr mir mit meinem Code helfen könnt, so packe ich euch auch gern die Kern-Elemente meines Codes dort hin :).

    Hoffe, ihr habt einige Ideen!

    MfG,
    X-Zat / Momo

    // EDIT:

    Ich programmiere kein Spiel, deswegen hab ich's trotz Nutzung von GDI erstmal hier gepostet. Und ja, die Basics von GDI kenne ich, nur habe ich nirgends einen performanten Weg gefunden, wie ich mit GDI zeichnen lassen kann...
    Vielen Dank!

    Habe im Moment kein VB hier, werde mich aber heute Nacht wieder daran setzen!

    Der Artikel besagt also:

    - Brushes, Pens, etc. möglichst nicht im Sub erstellen und verwerfen sondern 1x extern deklarieren (kommt gut, da ich noch eine Klasse zum verwalten der Fonts, Farben, Bilder erstellen werde - Da kann ja alles wunderbar rein)
    - Bei Bildern den Compositing-Mode ändern (habe teilweise Layer mit Transparenz, um einen Glossy-Effekt darzustellen, vielleicht kann man ja zwischen den Modes zeitsparend wechseln?)

    Ansonsten hätte ich da noch eine Frage:

    Mein System läuft so, dass meine Form (Form1) alle Inputs verwaltet und zeichnet. Sie beinhaltet eine Liste mit Objects einer selbst erstellten Klasse (GameItem - Hat u.A. die Eigenschaften Name und Position).
    Beim OnPaint wird zuerst der Hintergrund gezeichnet, dann das anzuzeigende Game aus der Liste mit Rein- und Rausfahr-Animation (habe dazu ein Enum zur Beschreibung des Zustandes geschrieben). Wenn das Game angezeigt werden soll, wird ihm das Graphics-Object übergeben, welches es dann in seiner Klasse zum Zeichnen verwendet.
    Meine Frage ist: Ist es schlau, einer anderen Klasse (hier GameItem) per Parameter das Graphics-Object der Form zu übergeben oder sollte man es da neu deklarieren mit "Dim g as Graphics = Form1.CreateGraphics"?

    Und kann ich sonst noch evtl. Performance sparen?

    Erstmal vielen Dank!

    MfG,
    X-Zat / Momo