Formular anzeigen beschleunigen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Humax.

    Formular anzeigen beschleunigen

    Moin, hab mir einen kleinen Fussballsimulator programmiert. Mein Problem ist der langsame Bildschirmaufbau, quasi in allen Formularen (Spieltagsimulation / Tabellen) , da auf die Formulare natürlich einiges an Labels / Pictureboxen draufgepackt ist.
    Hat jemand eine Idee wie ich den Bildschirmaufbau beschleunigen kann?

    Probiert habe ich schon folgendes (alles ohne Erfolg):
    - Erst alle Labels / Pictureboxen mit den richtigen Werten befüllen, dann das Formular anzeigen.
    - Backgroundimage weg lassen
    - Formular laden, timer starten, nach dessen Ablauf die Controls "befüllen"
    - Opacity auf 0 setzen und erst am Schluss wieder auf 100

    Ideen die ich noch hätte, die ich aber nicht probieren will ehe hier jemand sagt, dass das (Perfomancetechnisch) was bringt!:
    - Die Labels / Pictureboxen erst zur Laufzeit erstellen
    - Versuch mit einem Backgroundworker

    Zum Ablauf, wo es hängt:
    Ich bin im Hauptmenu und klicke dann auf ein Untermenu, beispielsweise Tabelle oder nächster Spieltag. Ich blende also das aktuelle Formular aus, zeige die neue Form an

    VB.NET-Quellcode

    1. ​Me.Hide()
    2. frm_EwigeTabelle.ShowDialog()
    3. Me.Show()


    Im entsprechenden Formular werden dann die Labels / Picturboxen aktualisiert.
    Mal als Anhaltspunkt. In der Tabelle sind ca 220 Labels, 18 Pictureboxen und ein Backgroundimage, In der Spieltagssimulation, ca 60 Labels und 18 Pictureboxen sowie ein Backgroundimage.

    Ich habe mal 2 Screenshots angehängt, damit man einen Eindruck hat, wie die Formulare aussehen. Den Bildschirmaufbau erkennt man darauf natürlich nicht :(
    Bilder
    • Unbenannt.png

      472,3 kB, 464×475, 57 mal angesehen
    • Unbenannt1.png

      1,43 MB, 945×706, 57 mal angesehen
    Hallo @Humax
    Hast du mal mit der Stopwatch geprüft, welche einzelne Sache so lange dauert?
    Form1:

    VB.NET-Quellcode

    1. Public NotInheritable Class FormMain
    2. Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. End Sub
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Dim F2 As New Form2
    6. F2.ShowDialog(Me)
    7. End Sub
    8. End Class


    dein zweites Form:

    VB.NET-Quellcode

    1. Public Class Form2
    2. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim SW As New Stopwatch
    4. SW.Start()
    5. Total_irre_langsame_Aufgabe()
    6. SW.Stop()
    7. Label1.Text = SW.ElapsedMilliseconds.ToString()
    8. End Sub
    9. Private Sub Total_irre_langsame_Aufgabe()
    10. For i As Integer = 0 To 10000 Step 1
    11. Debug.WriteLine("Irre explodieren nicht, wenn man auf sie schießt! Egal, wie irre sie sind!")
    12. Next
    13. End Sub
    14. End Class

    Bilder
    • Screenshot 2021-09-26 150839.png

      11,3 kB, 479×360, 53 mal angesehen
    Evtl. alles in einem DataGridView darstellen statt der Verwendung einzelner Controls.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Humax schrieb:

    - Die Labels / Pictureboxen erst zur Laufzeit erstellen

    Bringt nur Mehraufwand, aber wohl keinen Performanceschub.

    Humax schrieb:

    - Versuch mit einem Backgroundworker

    Geht nicht, da die Daten in die Controls im GUI-Thread reinmüssen. Es wird also eine Fehlermeldung geben. Also bringt nix.
    Wenn Du schon so viel ohne Erfolg ausprobiert hast: Was ist denn, wenn Du alle Controls im Designer als unsichtbar einstellst? Geht es dann schnell? Wenn nicht, sind die Controls als Übeltäter raus. Obwohl mehr als 200 Controls schon derb ist.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ehh … aber Moment. Du solltest noch was ändern und dann in dem Zuge auch was testen. Denn wenn ich den Code in Post#1 sehe, dann sach ich nur: Dialoge richtig instanziieren
    Denn Du solltest es so machen:

    VB.NET-Quellcode

    1. Me.Hide()
    2. Using Dialog As New frm_EwigeTabelle
    3. Dialog.ShowDialog()
    4. End Using
    5. Me.Show()

    Das wäre eine richtige Handhabung von Dialogen und ermöglicht Dir auch zu sehen, ob die Formularerstellung der Zeitfresser ist oder die -anzeige, indem Du vor und nach der Using Dialog-Zeile die Zeit messen lässt.
    Dazu kööntest Du vorher und nachher dort nen Haltepunkt setzen und es wird Dir dann die verstrichene Zeit angezeigt.
    Bilder
    • Time.png

      3,65 kB, 269×98, 190 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Woher kommen die Bilder und wie groß sind die?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Humax schrieb:


    Mal als Anhaltspunkt. In der Tabelle sind ca 220 Labels, 18 Pictureboxen und ein Backgroundimage, In der Spieltagssimulation, ca 60 Labels und 18 Pictureboxen sowie ein Backgroundimage.

    Bei 220 Labels halte ich das Gesamtkonzept für nicht optimal. Arbeitest Du viel mit Strings? Da kann ggf. ein StringBuilder viel Geschwindigkeit bringen.
    Aktuelles Projekt: Z80 Disassembler für Schneider/Amstrad CPC :love:
    @VaporiZed
    So ich habe jetzt mal bissl was getestet...
    Ich habe erstmal nur alle Controls vor dem Öffnen der Formulare auf visible=false gesetzt, den Rest habe ich erstmal so belassen. Das Formular wird nun Ruckzuck angezeigt. Also liegt es an den vielen Controls und nicht am Code, der die Controls mit "Werten" befüllt. Das hatte ich auch nicht erwartet, denn da ist nicht wirklich was aufwendiges dabei. Es ist jetzt nicht optimal aber akzeptabel. Ein Formular jedoch baut sich immer noch sehr langsam und deutlich nachvollziehbar auf. Nach ewiger Sucherei im Code, ob da was unterschiedlich ist, dann mal im Designer geguckt. Da dieses Formular 2 verschiedene Größen haben kann, hatte ich dort das Backgroundimagelayout auf "Tile" gesetzt. Mit "None" läuft es jetzt genauso "flüssig". Habe also noch ein zweites passendes Backgroundimage erstellt und setze das jetzt.

    Danke für die Tipps.
    @Humax Ich bin bei @mrMo.
    Stell das alles in einem DataGridView dar. Dem kannst Du während der Dauer der Befüllung mit Daten sagen, dass es nicht updaten soll:
    docs.microsoft.com/de-de/dotne…uspendlayout?view=net-5.0
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Wo in Deinen Bildern oben kommt Transparenz bzw. ein Hintergrundbild vor?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du kannst natürlich dem DGV sagen, dass die geraden Zeilen Hintergrundfarbe 1, die ungeraden Zeilen Hintergrundfarbe 2 haben.
    Im DGV kannst Du auch Bilder anzeigen, das ist alles kein Akt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nur nochmal, um alle Klarheiten zu beseitigen: klappt's jetzt mit der Anzeigegeschwindigkeit, nachdem Du das Bilderlayout umgestellt hattest?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    RodFromGermany schrieb:

    Du kannst natürlich dem DGV sagen, dass die geraden Zeilen Hintergrundfarbe 1, die ungeraden Zeilen Hintergrundfarbe 2 haben.
    Im DGV kannst Du auch Bilder anzeigen, das ist alles kein Akt.


    Ja die Zeilenfarbe ist natürlich nicht das selbe wie auf einem extra erstellten Bild. Ich lasse es jetzt wie es ist.

    VaporiZed schrieb:

    Nur nochmal, um alle Klarheiten zu beseitigen: klappt's jetzt mit der Anzeigegeschwindigkeit, nachdem Du das Bilderlayout umgestellt hattest?


    Ja, der Bildschirmaufbau ist jetzt zwar nicht 100% flüssig, aber trotzdem schnell. Das passt jetzt so.