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 Direct2DCanvas blockiert Form bei hoher Repaint-Rate (https://www.delphipraxis.net/183501-direct2dcanvas-blockiert-form-bei-hoher-repaint-rate.html)

Memnarch 15. Jan 2015 09:38

Direct2DCanvas blockiert Form bei hoher Repaint-Rate
 
Moin,
Ich habe eine Animation, welche ~60FPS benutzt. Mit dem Direct2D-Canvas bekomm ich das ganze auch sauber, flüssig und schnell hin. Ich habe aber ein kleines Problem: Die Form auf der das ganze statt findet, lässt sich nicht/nur sehr schwer bewegen. Reduziere ich die Repaint-Rate auf z.B. 10 geht's.

Ich erstelle den Canvas mit dem WIndow-Handle constructor, also:

Delphi-Quellcode:
Canvas := TDirect2dCanvas.Create(WIndowHandle)
Das ist wichtig, da die anderen methoden (DC und Canvas) leichte Microfreezes und niedrigere Performance haben. Wahrscheinlich, da hier mit der GDI zusammengearbeitet wird.

Das WindowHandle war Testweise die Form selbst, und einmal von einer eigenen TCustomControl. Jedesmal dasselbe Resultat.

Wie refreshe ich?
Delphi-Quellcode:
Control.Repaint()
Control war hierbei entweder die Form oder meine EIgene komponennte. Im jeweiligen (On)Paint des Controls stand dann die Zeichenlogik. Jemand eine Ahnung, warum die Form blockiert?

Grobes Skelett der Zeichenmethode:
Delphi-Quellcode:
Canvas.BeginDraw;
[Do stuff]
Canvas.EndDraw;
Und ja ich möchte unbedingt die WindowHandle-Variante nehmen!

PS:
Getriggert wird das Refresh über einen Thread, der in regelmässigen abständen über queue eine funktion an den Hauptthread schickt, welche intern das Repaint aufruft.

Grüße
Memnarch

Memnarch 15. Jan 2015 11:27

AW: Direct2DCanvas blockiert Form bei hoher Repaint-Rate
 
Okay wenn ich im Thread Synchronize verwende anstatt Queue gehts. Musste natürlich dann auch eine complexere Tick-Methode schreiben, welche die Zeit innerhalb des Synchronize vom zu wartenden Zeitraum abzieht bzw mit einkalkuliert. Jetzt klappt alles.

MFG
Memnarch


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:52 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