Entwickler-Ecke

Multimedia / Grafik - flickern bei canvas.pixels


geronimo - Fr 06.12.02 14:38
Titel: flickern bei canvas.pixels
also ich hab hier ein programm, das später einmal ca 1000 objekte verwalten soll (autos, die auf einer strasse fahren).
zur zeit laufen nur 6 objekte und es gibt schon probleme...

also ich hab da 2 images, die das strassenbild bilden (2pixel weiss, 36 px grau, 2px weiss , das ganze mal 2). darüber liegt eine paintbox, in die ich jede sekunde 10 mal die neue position eintrage.
wenn ich jetzt die paintbox refreshe, flimmert es extrem. deshalb zeichne ich jedes mal in der farbe der strasse das auto weg :roll: .
wenn es jetzt über den mittelstreifen fährt ist der mittelstreifen also weg.

wo soll ich da ein doublebuffered:=true; anwenden?

mfg geronimo


Nightwalker_Z - Fr 06.12.02 15:31

HiHo
Also .. DoubleBuffered:=True ist schon mal ganz gut (dann flackert es wenigstens nicht mehr).

ABER: :lol:
Wenn du eine Paintbox benutzt um was zu zeichnen und irgendein beliebiges Objekt über deine bereits gezeichneten Komponenten zieht / zeichnest / bewegst / wasauchimmer, verschwindet dein Kunstwerk.
Ist halt nun mal so.
Eine Alternative ist statt ner Paintbox ein Image als Zeichenfläche zu benutzen.

Einige Beispiele:

Quelltext
1:
 Paintbox1.Canvas.Lineto(x,y)                    


würdest du jetzt so machen:


Quelltext
1:
 Image1.Picture.Bitmap.Canvas.Lineto(x,y)                    


Damit das funktioniert musst du in der Prozedur TForm1.FormCreate
folgende Einträge hinzufügen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TForm1.FormCreate(Sender: TObject);
var Bitmap: TBitmap;
begin
  Bitmap:=TBitmap.Create;
  Bitmap.Width:=Image1.Width;
  Bitmap.Height:=Image1.Height;
  image1.Picture.Graphic:=Bitmap;


Dann sollte auch alles funktionieren.
(Aber nicht DoubleBuffered:=True) vergessen

Hoffe ich konnte helfen
Greetz
Nightwalker


Nightwalker_Z - Fr 06.12.02 15:33

Ahso ... nochmal wegen dem Doublebuffered
(hab ich vorhin überlesen)


Quelltext
1:
2:
3:
4:
procedure TForm1.FormShow(Sender: TObject);
begin
DoubleBuffered := True;
end;


So dürfte alles funzen :think:

Gruß
Nightwalker_Z


Postbote - Fr 06.12.02 19:12

Je nachdem wie komplex dein Programm wird, würde ich dir folgendes empfehlen : du zeichnest deine Bitmaps mit BitBlt (siehe winapi sdk) oder benutzt DirectDraw.


geronimo - Mo 09.12.02 22:16

Ok Danke! Ich werd jetzt mal das Zeichnen auf ein Image versuchen. 8)


Nightwalker_Z - Di 10.12.02 10:31

Jupp mach das - ich denke damit wird es schon klappen :)

Greetz
Nightwalker_Z