AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TGPGraphic mit Zwischenbuffer aktualisiert sich nicht
Thema durchsuchen
Ansicht
Themen-Optionen

TGPGraphic mit Zwischenbuffer aktualisiert sich nicht

Ein Thema von Memnarch · begonnen am 5. Jan 2015 · letzter Beitrag vom 15. Jan 2015
Antwort Antwort
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

TGPGraphic mit Zwischenbuffer aktualisiert sich nicht

  Alt 5. Jan 2015, 16:14
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:
FGraphic := TGPGraphics.Create(FBuffer.Canvas.Handle); Und in der animationsroutine:
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)
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#2

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht

  Alt 6. Jan 2015, 08:41
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.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#3

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht

  Alt 6. Jan 2015, 09:54
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%
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Thomasl

Registriert seit: 19. Jun 2006
Ort: Vreden
66 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht

  Alt 8. Jan 2015, 18:35
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
Thomas Levering
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#5

AW: TGPGraphic mit Zwischenbuffer aktualisiert sich nicht

  Alt 15. Jan 2015, 09:29
Danke, werd ich mir mal angucken.
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:53 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