Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi nur Bereiche neuzeichnen (https://www.delphipraxis.net/79118-nur-bereiche-neuzeichnen.html)

Cöster 16. Okt 2006 17:09


nur Bereiche neuzeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi!

Zur Performanceverbesserung (2D-Spiel/PaintBox), möchte ich nur Bereiche neuzeichnen. In dem Spiel gibt es mehrere Kugeln, die sich über die PaintBox bewegen. Ich möchte also nur die Kugeln neuzeichnen.

Ich zeichne sie auf ein Bitmap (quadratisch, Seitenlänge = Durchmesser der Kugel) im Speicher und kopiere sie dann per BitBlt alle nacheinander auf die PaintBox.

Da das Bitmap im Speicher ein Quadrat, ist, kommt es gelegentlich vor, dass die Ecken des Quadrats eine andere Kugel übermalen (siehe Anhang).

Wie kann ich das verhindern?

Meine Ideen:
1) Gibt es eine Methode wie BitBlt, die stattdessen Kreise kopiert?
2) Direktes Zeichnen auf PaintBox.Canvas, ohne Bitmap im Speicher
3) Sollte das Bitmap im Speicher die Größe der PaintBox haben, dass ich also doch ALLES neuzeichne?


EDIT: Anhang vergessen

Cöster 16. Okt 2006 17:37

Re: nur Bereiche neuzeichnen
 
So, nun ist auch was im Anhang

Zacherl 16. Okt 2006 17:50

Re: nur Bereiche neuzeichnen
 
Beim zeichnen des Hintergrundes könntest du BrushStyle auf bsClear stellen ...

Florian

Cöster 16. Okt 2006 19:53

Re: nur Bereiche neuzeichnen
 
Hm. An welcher Stelle und wovon muss ich denn Brush.Style auf bsClear setzen?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp: TBitmap;
begin
  // PaintBox1.Canvas.Brush.Style := bsClear;
  Bmp := TBitmap.Create;
  try
    Bmp.SetSize(30, 30);
    with Bmp.Canvas do
    begin
      // Brush.Style := bsClear;
      Pen.Color := clYellow;
      Brush.Color := clYellow;
      Ellipse(0, 0, 30, 30);
      BitBlt(PaintBox1.Canvas.Handle, 0, 0, 30, 30, Handle, 0, 0, SRCCOPY);
      Pen.Color := clRed;
      Brush.Color := clRed;
      Ellipse(0, 0, 30, 30);
      BitBlt(PaintBox1.Canvas.Handle, 20, 20, 30, 30, Handle, 0, 0, SRCCOPY);
    end;
  finally
    Bmp.Free;
  end;
end;

Cicaro 17. Okt 2006 10:43

Re: nur Bereiche neuzeichnen
 
Du verwendest doch ohnehin Classen aus der Unit Graphics.

Dann kannst du auch Bmp.Transparent auf True setzen und mit PaintBox1.Canvas.Draw(x,y,Bmp) die Kugeln zeichnen. Ggf. müsste man auch mal Bmp.TransparentColor auf einen gewünschten Wert setzen.

Cöster 17. Okt 2006 15:16

Re: nur Bereiche neuzeichnen
 
Ah, danke Cicaro!! Draw statt BitBlt :thumb:

Macht es denn dann überhaupt Sinn, BitBlt statt Draw zu verwenden, wenn der letzte Parameter sowieso SRCCOPY ist und das gesamte Bitmap im Speicher und nicht nur Teile davon auf ein Canvas kopiert werden sollen? Das ist ja meistens der Fall, wenn BitBlt benutzt wird. Oder ist BitBlt vielleicht schneller als Draw?

Cöster 17. Okt 2006 17:20

Re: nur Bereiche neuzeichnen
 
Arghh, Draw selbst ist zwar nur minimal langsamer als BitBlt, aber Transparent ist unerträglich. Bei einem 50x50 Bitmap dauert das ganze allein durch Transparent 200 (!!!) mal so lange.

Hat sonst noch jemand ne Idee?

Gandalfus 17. Okt 2006 20:48

Re: nur Bereiche neuzeichnen
 
try finally wegnehmen das ist nur zeitverschwendung.

Matze 17. Okt 2006 21:06

Re: nur Bereiche neuzeichnen
 
Zitat:

Zitat von Gandalfus
try finally wegnehmen das ist nur zeitverschwendung.

:shock: Resorcen-Schutzblöcke sollte man generell verwenden!

Gandalfus 17. Okt 2006 21:41

Re: nur Bereiche neuzeichnen
 
nicht da wo es auf Geschwindigkeit ankommt


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz