Announcement

Collapse
No announcement yet.

langsame Grafik in VB2005?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • langsame Grafik in VB2005?

    Hallo,
    habe Performance_Problem mit VB2005 im Vergleich zu VB6:
    Habe in VB2005 eine Scheife:
    Code:
    Deklarationen usw.
    
    do
    ...
    'Programm ->werte
    g.FillRectangle( , , , , )
    Picture1.Refresch()
    ...
    loop Until ...
    läuft deutlich!!! langsammer im Vergleich zu VB6:

    Code:
    do
    ...
    'Programm ->werte
    Picture1.Line( , )-( , ),,BF
    ...
    loop until ...
    Bin gerade umgestiegen auf VB2005!
    Was mache ich falsch?
    VB2005 soll doch schneller sein als VB6!?
    apelles

  • #2
    Hallo apelles,

    Die Zeile "Picture1.Refresh()" ist hier der Performancefresser. Ein "Refresh()" sollte normalerweise sowieso nicht zum Einsatz kommen. Meist reicht ein "Invalidate()".

    Mir ist noch nicht klar, warum Du in einer Schleife das eine Bild immer wieder neu zeichnen lassen willst. Warum machst Du nicht Deine Zeichnungen (in der Schleife) und machst anschließend ein "Invalidate()"?

    Grüße
    _ntr_

    Comment


    • #3
      Hallo ntr,
      ich programmiere z.B. Game of Live (zelluläre Automaten) und deshalb muß ich eine Schleife benutzen wegen Berechnungen und neuer Darstellung.
      Picture.Refresh() ist notwendig, weil beim VB2005 fehlt AutoRedraw=true.
      Picture.Invalidate() ist ebenso langsam.Habe schon probiert.
      Picture.Refresh kannst Du weglassen, wenn man statt der für Refresh() notwendigen Deklaration: ...=Graphics.FromImage(bild) direkt im Programm deklariert: ...Graphics.FromHwnd(Picture1.Handle)-dann brauchst Du kein Refresh(), Bildzeichnung erfolgt auch viel schneller, allerdings nicht als ganz neues Bild auf Schlag, sondern schön der Reihe nach wird gezeichnet und das Schlimmste dabei ist, wenn Du 1D-zelluläre Automaten zeichnest, schön Zeile für Zeile, muß Du das Bild irgendwann scrollen- und dann wird sofort alles gelöscht, was beim Scrollen außerhalb des Bildes war.
      Auch das setzen von: ....CompositingQuality.HighSpeed bringt nichts.
      Mir gehts nur darum, ob man das irgendie anders beschleunigen kann.
      Ein Trick??? Nicht aber mit: Durchgang Mod 20 und dann Refresh().

      In VB6 geht sowas ruckzuck.
      Verstehe dann nicht die Vorteile von VB2005???????????

      Ich danke Dir für die Antwort.
      Vielleicht weißt Du noch was?!!!

      apelles

      Comment


      • #4
        Hallo apelles,

        so ganz habe ich es immer noch nicht verstanden. Du zeichnest wie viele Bitmaps?

        Ich hoffe doch nur eines. Genauso hoffe ich, dass Du Programmlogik von der Darstellung trennst.

        Sprich folgendes:
        Du hast eine Matrix (z.B. Dictionary mit "Point" als Key und eine eigene Klasse, die den Zustand des "Pixels" sich merkt, die auch weiß, welches Quadrat sie innerhalb des Gesamtbildes darstellen soll (Key), und sich bei Bedarf neu zeichnen lassen kann, indem man das Graphics-Objekt einer eigenen Paint-Methode übergibt.)

        Also schematisch gesprochen so:

        1. Datenhaltung -> Dictionary (Key: Point - X und Y Koordinate, Value: eigene Klasse Life-Quadrat)
        2. Eigene Life-Quadrat-Klasse:
        2a. Sie bekommt über eine Eigenschaft einmalig initial mitgeteilt wo dessen Location sich befindet (Position der linkeren oberen Ecke des Quadrats innerhalb des Gesamtbildes).
        2b. Sie hat die Information, ob sich darin gerade Leben befindet, oder nicht
        2c. Sie bietet eine Paint-Methode an, die von aussen aufgerufen werden kann, die auch das Graphics-Objekt übergeben bekommt, und aufgrund der Location und der Lebensinformation dementsprechend ein leeres oder volles Quadrat zeichnet.
        2d. Diese Klasse ist Bitte KEIN von Control abgeleitete Klasse (viiel zu langsam!)
        3. Dein Game-of-life Programm
        3a. Ist eine Klasse, die von (Scrollable-)Control abgeleitet ist
        3b. Bei OnPaint wird ein Bild (Member-Variable) über die gesamte Fläche gezeichnet (Dein Game-Of-Life "Spielfeld")
        3c. Dein Control überwacht nun das Dictionary zyklisch (z.B. mittels Timer). Dabei geht es alle Zellen durch, und setzt, bzw. löscht die Lebensinformation der einzelnen Zellen.
        3d. Danach zeichnest Du das Bild neu (am Besten per Double Buffer, d.h. ein neues Bild, das Du nach fertigstellen einer Member-Variablen zuweist und ein Invalidate() aufrufst)

        Dein Control sollte dann auch noch von außen Steuerbar sein (z.B. Timerintervall setzbar etc...)

        Dann sollte das performant und anständig umgesetzt sein. Ich habe jetzt zu wenige Kenntnisse auswendig, das in VB-Code auszudrücken, in C# könnte ich Dir das aus dem Ärmel schütteln ;-)

        Vielleicht muss man im Objektorientierten Programmierstil den Ansatz überdenken, sehr viele VB5, VB6 Projekte lassen sich nicht so 1:1 in VB.NET abbilden (<- SEHR WICHTIG!).

        Grüße
        _ntr_

        Comment


        • #5
          Hi ntr,
          danke für Deine Mühe.
          Ich zeichne natürlich nur ein Bild, aber immer wieder neu (in der Schleife)!!!Und hier liegt das Problem: die langsame Darstellung des neuen Bildes im Vergleich zu VB6.
          Natürlich VB6 1:1 zu VB2005 geht oft nicht.
          Aber Mathe ist praktisch identisch, hier kannst Du keine Fehler machen.
          In der Schlefe rechnest Du, bekommst Zahlen und anhand der Zahlen zeichnest Du das Bild, dann rechnest Du erneut und bekommst Zahlen und wieder ein neues Bild mit .Refresh() und das läuft dann immer weiter nach gleichen Schema.
          Der einzige Unterschied ist nur in der Deklaration der Objekte in VB2005.
          Wenns Dich interessiert, schau Dir so ein fertiges Programm in Inet an: Game of Live - ist von dem Mathematiker J.H.Conway Ende 60-iger erfunden worden.
          Es ist sogar möglich das es in C# schneller läuft?
          Ich habe einen Übersetzer von C# nach VB2005 (das was der nicht immer schafft, mach ich dann selbst-die Konstruktion und vieles mehr klappt aber!).
          Nun OK, schauen wir mal, was die Zeit noch so bringt.
          Ich grüße Dich und danke nochmals für Dein Interesse.
          apelles

          Comment

          Working...
          X