Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TGPGraphic mit Zwischenbuffer aktualisiert sich nicht (https://www.delphipraxis.net/183360-tgpgraphic-mit-zwischenbuffer-aktualisiert-sich-nicht.html)

Memnarch 5. Jan 2015 16:14

TGPGraphic mit Zwischenbuffer aktualisiert sich nicht
 
Hallo,
Aktuell benutze ich die GDIPlus Library von http://www.bilsen.com/gdiplus/index.shtml

Ich wollte eine Animation zeichnen, und damit diese nicht flackert, das ganze in in eine Bitmap zwischenrendern, welche anschließend auf dem canvas landet.
Eigentlich sollte ich folgendes nur einmal machen müssen:
Delphi-Quellcode:
FGraphic := TGPGraphics.Create(FBuffer.Canvas.Handle);
Und in der animationsroutine:
Delphi-Quellcode:
Canvas.draw(0, 0, FBuffer)
das klappt aber irgendwie nur für den ersten Frame. Danach aktualisiert sich die oberfläche nicht mehr. Ich bin gezwungen das FGraphic object jeden Frame neu zu erstellen, damit alles klappt.

Benutze ich statt der Bitmap einfach direkt das Fensterhandle: (Constructoren sind überladen)
Delphi-Quellcode:
FGraphic := TGPGraphics.Create(MyControl.Handle);
Muss ich dies nur ein einziges mal machen. Allerdings flackert die animation mitunter(was ich eigentlich vermeiden wollte).

Jemand eine Idee?
MFG
Memnarch

Memnarch 6. Jan 2015 08:41

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht
 
So habe es jetzt so gelößt, dass ich 2 TGPGraphics erzeuge. das erste Benutzt eine TGPBitmap als Backbuffer, das zweite wird vom Fensterhandle erzeugt.
Nachteil:
Es ist um einiges langsamer. Zeichenfläche 470*255, Animation 60Fps

Alte methode:
Jedesmal neues GDIP-Objekt erstellen, in eine normale TBitmap und diese per TCanvas zeichnen benötigte von einem Dualcore@2.66GHZ ~3% (1.5% fürs Zeichnen des Backbuffers und 1.5% für das Zeichnen aufs Fenster)

Neue Methode:
Einmalig die GDIP-Objekte erstellen, erst in den Backbuffer zeichnen und dann per DrawImage in das GDIP-Object des Fensters zeichnen ~7%(1.5% fürs zeichnen des Backbuffers, der rest fürs Zeichnen ins Fenster)

Das wirkt doch irgendwie arg langsam, für das reine zeichnen eines Bildes aufs Fenster und skaliert entsprechend schlecht mit wachsender größe der Zeichenfläche.

Memnarch 6. Jan 2015 09:54

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht
 
Okay habe auch das Problem gelößt. Ich benutze wieder nur ein TGPGraphics (Backbuffer) aber erstelle die zeichenflächen jetzt wie folgt:

Für den Backbuffer:
CreateCompatibleDC
CreateCompatibleBitMap
(Beides from DesktopDC)

erstelle dann ein TGPGraphics vom neuen DC und benutze am ende BitBlt um das Endresultat aufs Fenster zu kriegen. Bin jetzt wieder bei 3%

Thomasl 8. Jan 2015 18:35

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht
 
Ich verwende GDI+ auch zum zeichen.
Aber wenn beim Form DoubleBuffer an ist, und keine Panels mit ParentBackground verwendet werden Flackert da nichts.

Hier habe ich eine Unit gepostet in der ich auch GDI+ verwende (ohne Flackern)

http://www.delphipraxis.net/1285499-post80.html

für das Zeichnen kann dann Graphics.SetSmoothingMode in der unit auch wieder aktiviert werden

Memnarch 15. Jan 2015 09:29

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht
 
Danke, werd ich mir mal angucken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:09 Uhr.

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