Announcement

Collapse
No announcement yet.

Effektivere Zeichnungsmethodik?

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

  • Effektivere Zeichnungsmethodik?

    Hallo Experten,

    ich habe folgendes Problem. Ich zeichne mittels Canvas ein Bild auf einer TForm, bestehend aus 64x64 Rectangles. Das ganze sollte möglichst flott und mit möglichst wenig Prozessorlast geschehen. Es kann sein, dass das Frame mit den 4096 Rechtecken mit mehr als 30 FPS aktualisiert werden muss. Hinzu kommt, dass von den 64x64 Frames zeitgleich 4 auf der Form dargestellt werden.
    Nun habe ich das Problem, dass viele Rechner bei hohen Frameraten hier schon derbe in die Knie gehen und bei 100 % Prozessorlast hängen.
    Nun zu meiner Frage: Es ist mir klar, dass die CPU hier immer Grenzten setzt, aber wie kann ich am effektivsten vorgehen? Momentan läuft einfach eine geschachtelte for-Schleife:

    Code:
       for(z=0;z<SPALTE*2-rowdecr;z++){
    		for(s=0;s<SPALTE*2-1;s++){
    		   setRGB(z,s,0);
    		   sum=(b<<16)|(g<<8)|r;
    		   TempBrush->Color=sum;      //now draw rectangle
    		   Canvas->Brush=TempBrush;
    		   Canvas->Rectangle((xoff),(yoff),(xoff+rectsize+1),(yoff+rectsize+1));}
    }
    Ist es evtl. von Vorteil erst in ein Bitmap oder dergleichen zu zeichnen und dann die Darstellung zu übernehmen?
    Gibt es effektivere Methoden als Canvas->Rectangle ?

    Gruß, Bodo

    Edit: habe einige Zeilen noch aus dem Code entfernt, natürlich wird auf xoff und yoff noch rectsize addiert...

  • #2
    BitBlt

    Hallo bodo2407,

    bei einer Canvas Zeichnung direkt auf eine Form wird (so weit ich weiß) die Form nach jedem Rectangle aufgefrischt und das benötigt natürlich Zeit.
    Schneller geht es, wenn Du alles zuerst in ein TBitmap zeichnest und dann nur den Teil auf den TForm->Canvas (mit BitBlt) kopierst, der sich geändert hat.

    Zum Beispiel:

    Code:
    BitBlt(TForm->Canvas->Handle,Left1,Top1,Width1,Height1,TBitmap->Canvas->Handle,Left2,Top2,SRCCOPY);
    Damit kopierst Du von TBitmap->Canvas ab "Left2" und "Top2" ein Rechteckausschnitt mit den Abmaßen "Widht1" und "Height1" auf TForm->Canvas an die Stelle "Left1" und "Top1".

    Wenn das nicht schnell genug wird, mußt Du Dich mit DirectX oder OpenGL rumschlagen. Da wird der Grafikkartenprozessor stärker mit genutzt.

    Comment


    • #3
      a) statt BitBlt gibt es entsprechende Methode des C++Builders

      b) ist die Frage der Auffrischung in Zusammenhang zu sehen WO das Zeichnen in den Canvas erfolgt. Das sollte im OnPaint erfolgen. Damit findet keine Auffrischung statt.

      c) Bevor man DircetX oder OpenGL einsetzt, kann man versuchen zum Gewinn von Performance das Zeichnen bzw. die komplette Darstellung des gesamten Canvas in einen Thread zu legen.
      Zuletzt editiert von Christian Marquardt; 26.08.2009, 07:35.
      Christian

      Comment


      • #4
        Hallo Christian,

        danke für die vielen Tipps!
        Das klingt doch schon sehr erfolgsversprechend. Ich denke ich probiere zuerstmal den Umweg über TBitmap.

        Gruß, Bodo

        Comment


        • #5
          Ich muss das noch mal hochholen:
          Im Endeffekt bin ich hier nicht weitergekommen, alle Versuche brachten nicht genug Leistung.
          Bisher habe ich auch gezögert mich mit DirectX und Konsorten anzufreunden...
          hat hier jemand einfache Code-Beispiele?
          Die Hilfe ist hier mehr als rudimentär, bisher hab ich nur .NET files gefunden.

          Ausserdem gibt es noch DirectShow/DirectDraw... gibt es da irgendeine Implementierung für den C++-Builder?

          Ich hatte mit diesen Geschichten bisher noch nix am Hut und steh gerade so ziemlich auf dem Schlauch.

          Danke!

          Comment

          Working...
          X