Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 19:01

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Flimmern bei Canvas
BeitragVerfasst: Do Jan 15, 2004 16:27 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 09:15
Beiträge: 70
Wohnort: Italien
Ich habe ein kleines Problem bei der Benutzung von TCanvas (PaintBox): Weil ich relativ viele Bitmaps hineinzeichne, flimmert das Bild, weil es die Bitmaps sofort aktualisiert weden und somit die Oberfläche nicht nur dann aktualisiert, wenn ich es will.

Ich habe versucht in einen Buffer zu zeichnen, aber das funktioniert irgendwie nicht... :cry: :
Code:
  1.  
  2. var buffer : TCanvas;
  3. begin
  4.   buffer := TCanvas.Create;
  5.  
  6.   Galton.Animate; //Szene animieren
  7.  
  8.   Galton.Render(buffer); //Szene in den Buffer zeichnen
  9.  
  10.   PaintBox1.Canvas.CopyRect(PaintBox1.Canvas.ClipRect,
  11.     buffer, buffer.ClipRect);
  12.  
  13.   buffer.Free;
  14. end;
  15.  


Die Fehlermeldung ist: "Leinwand/Bild erlaubt kein Zeichnen"

_________________
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt" Albert Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 16:46 
Offline
DGL Member
Benutzeravatar

Registriert: So Dez 29, 2002 13:24
Beiträge: 91
Wohnort: Oberhausen (NRW)
Hi. Versuch das mal:

Code:
  1. Form1.DoubleBuffered := True


Dann müsste es eigentlich klappen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 16:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Versuch mal anstelle der TCanvas ein TBitmap zu benutzen.
Dem Bitmap weist du eine Höhe und Breite zu und dann kannst du auf die Canvas von dem Bitmap zeichnen. Wenn du fertig bist kannst du es mittels PaintBox1.Canvas.Draw(0, 0, Bitmap) zeichnen.

PS: Die Canvas ist nur eine Basisklasse die selber nicht zeichnen kann. Sie bietet nur die Schnittstelle. Die davon abgelittenen Klassen haben dann die entsprechenden Funktionen implementiert.

PPS: Wenn du dich nur auf die GDI beschränkst, dann solltest du mal den HandleType des Bitmaps auf bmDDB stellen. Du hast dann zwar keinen direkten Zugriff auf die Pixel, mittels Scanline, mehr aber dafür ist es auch nur um bis zu 100 mal schneller als die Normale GDI. Dadurch verwendet Delphi ein sehr hardwareoptimiertes Format und nutzt die volle Beschleunigung der Grafikkarte aus. :-)

Ach ja Und das Pixelformat solltest du bei dem Bitmap auch noch einstellen. Entweder 16 oder 32 Bit. Je nach geschmack. 16 Bit kann mit unter auch noch schneller sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 16:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 09:15
Beiträge: 70
Wohnort: Italien
@Xcessive: kein Unterschied. :x

Direkt aufs Formular kann ich nicht zeichnen; deswegen benutze ich eine Komponente vom Typ TPaintBox. Und das hat die Eingenschaft doublebuffered nicht.

_________________
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt" Albert Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 17:00 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 09:15
Beiträge: 70
Wohnort: Italien
@ Lossy eX:
Es funxt prima. :D. Wusste gar nicht, das TCanvas nur eine Art Interface ist...(durch die Delphi-Hilfe wird man öfter nicht soo schlau, wie ich das gerne hätte :lol: ).

_________________
"Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt" Albert Einstein


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 17:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Noch etwas. Mit Hilfe von 2 Bitmaps kannst du auch DoubleBuffering implementieren. Funktionierendes...
In das eine zeichnes du wärend das andere zum Zeichnen auf das Fenster benutzt wird. Wenn du fertig bist tauscht du die beiden Bilder bloß aus. Also entweder die Variablen oder eine Indexvariable für ein Array mit 2 Feldern.
Code:
  1.  BufferFront: Integer;
  2.  BufferBack: Integer;
  3.  Buffers: Array[0..1] of TBitmap;
  4.  
  5.  // Später im Code
  6.  BufferFront := 0;
  7.  BufferBack := 1;
  8.  // oder eben
  9.  BufferFront := 1;
  10.  BufferBack := 0;
  11.  
  12.  // beim Zeichnen
  13.  PaintBox.Draw(0, 0, Buffers[BufferBack]);


So habe ich das Momentan auch in dem Projekt für meine Firma und Funktioniert 100%tig ohne Flimmern oder Flackern und schnell isset auch noch.

Wenn du direkt auf ein Fenster zeichnest isses alle mal langsamer als wenn du es vorher erst einmal in ein Bild zeichnest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 17:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Huch. Ich sehen gerade. Das TCanvas ist nicht so leer wie in angenommen hatte. Aber die wichtige Handleerstellung (damit man es überhaupt benutzen kann) passiert in einer abgelittenen Klasse.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Jan 15, 2004 17:06 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jul 12, 2002 07:15
Beiträge: 916
Wohnort: Dietzhölztal / Hessen
Programmiersprache: C/C++, Obj-C
Ist Offtopic, aber: wir sind mittlerweile 4 nach 2000!

_________________
Und was würdest Du tun, wenn Du wüsstest, dass morgen Dein letzter Tag auf dieser Erde ist?


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] und 11 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]