Registriert: So Apr 01, 2007 17:51 Beiträge: 42 Wohnort: Hamm/Westf.
Rufe ich mein Zeichenfenster mit einem Normalen Timer von Delphi auf ist alles Normal. Rufe ich die über TimeSetevent auf , bleibt alles Dunkel.
Selbst mit 2 Hz nur Die normalen Textausgaben dazu <> OGL werden angezeigt. Selbst Application.ProcessMessage brachte nix. Drücke ich auf RadioButton kommt ein Frame.
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
Also klug sind hier ne ganze Menge Leute.
Was hast du denn im Timer gemacht und was machst du mit TimeSetEvent, was macht/ist dein Zeichenfenster und was macht der Radiobutton? Was hast du mit Application.ProcessMessage gemacht? Und was meisnt du mit "bleibt alles Dunkel"? Dunkel = ClearColor?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Worauf zeichnest du? So wie ich dich verstanden habe benutzt du OpenGL und normale GUI Elemente zusammen? Hast du da den Context von einem Panel als Zeichenfläche oder wie machst du das?
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Könnte es sein, dass der Multimedia Timer den Callback aus einen anderen Thread heraus ausruft? Normale Windows Events werden in die MessageQueue der Anwendung gepackt und müssen dort von der Anwendung selbst rausgeholt und abgearbeitet werden. Das macht praktischerweise bereits das TApplication Objekt für uns. Ein Multimedia Timer arbeitet aber anders. Und zwar wird dort im Windows wohl ein Thread erstellt und aus diesem heraus dann der Callback aufgerufen.
So weit eigentlich kein Problem. Nur leider ist OpenGL Threadgebunden. Und wenn du aus dem VCL Thread OpenGL Initialisierst und dann in einem anderen Thread benutzen wolltest, dann laufen alle diese OpenGL Aufrufe in leere. Dabei spielt es keine Rolle ob der Code sich eine Unit teilt etc.
Um dir da jetzt eine sinnvolle Antwort auf deine Frage geben zu können weiß ich leider zu wenig von deinem Projekt. Generell würde ich aber sagen, dass du den Multimedia Timer nur benutzen solltest, wenn du wirklich darauf angewiesen bist. Ansonsten würde ich immer eine eventbasierte Lösung vorschlagen. Weil Windows nun mal so arbeitet und das einfach näher an der Natur von Windows liegt. Alternativ zu einem Timer kann man auch Application.OnIdle benutzen. Die FPS kann man natürlich ungeachtet der verwendeten Methode auf einen maximal Wert beschränken. Und für flüssige Animationen muss Timebased Movement in jedem Fall benutzt werden.
dann geh ich ma davon aus, das du den Timer brauchst, um deine FPS zu begrenzen. Ich mach das jetzt so: Einfach alles in OnIdle, da läuft er mit 100%. Und dann vSync aktivieren und er regelt sich selbst runter (bei mit 75Hz/FPS). CPU-Last sinkt dadurch auch. Alternativ kannst du zu GetTickCount den QueryPerformanceCounter nehmen, der liefert bei jedem Renderdurchlauf einen relativ genauen FloatWert der vergangenen Zeit.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Bergmann89 hat geschrieben:
Einfach alles in OnIdle, da läuft er mit 100%. Und dann vSync aktivieren und er regelt sich selbst runter (bei mit 75Hz/FPS). CPU-Last sinkt dadurch auch.
Also zum FPS begrenzen halte ich das nicht sonderlich optimal. Denn - bei älteren Systemen kenne ich das so, dass vsync nichts an CPU Last einspart - vsync kann man im treiber daktivieren ohne, dass du da was gegen kannst - und 60/75/100 fps find ich auch irgendwo gar nicht nötig. 30-40 sind auch genug. Meiner Meinung nach.
Wobei sich mir aber immer noch die Frage stellt was Gento eigentlich vor hat und ob das dann hier noch so recht zu thema passt oder nicht. Denn Gento. Bei deinen Beitrag "Hier würde die Lösung auch greifen : viewtopic.php?f=10&t=8669" habe ich echt nicht verstanden was du damit sagen willst.
Registriert: So Apr 01, 2007 17:51 Beiträge: 42 Wohnort: Hamm/Westf.
GetTickCount / QueryPerformanceCounter nur selbst benutzt , bringt die CPU auf 100 % Last.
Die bessere Wahl ist TimeGetTime weil der Ticker tickt nicht falsch bei mehreren Kernen.
Ich will mit 500-1000 Hz etwas abfragen und gegebenenfalls Daten übertragen. Die OpenGL Ausgabe soll nebenbei nach Vorgabe 20 - 50 Hz fix sein.(Über Timegettime mit 500-1000 Hz (siehe oben in der Schleife))
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Gento das ist jetzt nicht böse gemeint also bitte nicht falsch verstehen. Ich muss gestehen ich habe arge Probleme deinen Posts zu folgen bzw die zu verstehen, wenn du da sehr sprunghaft bist bzw alle 1-2 Sätze irgendwie das Thema wechselst. Zu mal du erst in deinem vorletzten Post überhaupt erst richtig zur Sprache gebracht hast was du eigentlich vor hast. Also Datenmessung mit 500-1000 Hz und Ausgabe mit 20-50 Hz.
Ich habe aber auch noch ein paar Anmerkungen/Fragen zu deinem Post. Was mehrere Kerne angeht. GetTickCount funktioniert da auch. Das Problem mit dem Kernwechsel existiert eigentlich nur bei QueryPerformanceCounter, da das direkt einen Wert der CPU ausließt.
Bzw. habe ich deinen einen Satz "GetTickCount / QueryPerformanceCounter nur selbst benutzt , bringt die CPU auf 100 % Last." so überhaupt nicht verstanden. Warum sollte dabei die CPU Last auf 100% gehen? Es sei denn man schreibt mit QueryPerformanceCounter eine Schleife die wartet bis 1-2ms vergangen sind. GetTickCount ist dort unbrauchbar, da es eine Minimalauflösung von 10-16 ms hat. Wenn die Abstände nicht 100%tig genau sein müssen, dann kann man alternativ auch einen hoch priorisierten Thread benutzen und dort 1 ms warten (sleep). Dann bekommt man auch irgendwas zwischen 500-1000 Hz. Sleep legt den Thread dann auch richtig schlafen.
Ich weiß jetzt auch nicht wie du das gelöst hast (scheint ja schon gelöst zu sein). Ich persönlich würde das so machen, dass der Multimedia Timer die Daten misst, diese (ggf. synchronisiert) sammelt und ein Timer von Zeit zu Zeit auf die Daten zugreift und sie darstellt.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.