Wann wird der Monitor aktualisiert?
-
Hallo NG,
gibt es mit DirectX und C# eine Möglichkeit den
Refresh des Monitors zu erkennen?
ein Beispiel:private Microsoft.DirectX.Direct3D.Device myDevice = new ... /* * weitere Deklarationen */ myDevice.BeginScene(); /* * .. zeichne irgendwas */ myDevice.EndScene(); myDevice.Present();Bei einem Monitor mit einer Aktualisierungsrate von 75 Hz gibt es einen Bereich von +13,3ms
in dem der Refresh stattfindet.
Das hätte ich gerne genauer, indem
ich den genauen Zeitpunkt des Refresh bestimme. Gibt es
eine Möglichkeit dafür?
Um genau Zeiten zu messen nehme ich die StopWatch Klasse.Vielen Dank
PanTau
-
Ich weiß nicht so genau, was du vorhast.
Mit DirectDraw kann man die momentan geplottete Scanline abfragen. So könnte man evtl. Zeitspannen abstecken. Die BlankTime muss aber noch mit zu.Ansonsten lässt sich doch die eingestellte RefreshRate als Zahl abfragen, z.B. mit GetAdapterDisplayMode.
Die DirectGraphics-Funktion GetRasterStatus sieht doch auch sehr fruchtbar aus.
-
Hallo SeppSchrott
vielen Dank für Deinen Hinweis.
Als ich mich dann mit der Methode GetRasterStatur beschäftigt habe,
habe ich schließlich die entscheidende Info gefunden.
Die Device.Present Methode wird per Default erst ausgeführt, wenn eine vertikale
Synchronisation abgeschlossen ist. Zumindest habe ich das so verstanden.
Ich brauche das, um Reaktionszeiten von Anwendern zu messen:static void Main(string[] parameter) { programm = new Fenster(); programm.Show(); while (programm.Created == true) { programm.Render(); Application.DoEvents(); } } public class Fenster : Form { /*muss noch zu einem günstigen Zeitpunkt gestartet werden*/ private Stopwatch systemUhr = new Stopwatch(); public void Render(){ leseTastatur(); if (neuerText == true){ myDevice.BeginScene(); /* * .. zeichne irgendwas */ myDevice.EndScene(); myDevice.Present(); t_alt = systemUhr.ElapsedMilliseconds; neuerText = false; } } public void leseTastatur(){ /* * lese Tastaur mit DirectInput * und setzte richtigeTaste */ if (richtigeTaste == true){ reaktionszeit = systemUhr.ElapsedMilliseconds - t_alt; neuerText = true; } } }Was im Code nicht steht, ist dass die Zeit zwischen jedem Aufruf von
leseTastatur auch gemessen wird. Überschreitet diese Zeit die Grenze für die
gewünschte Genauigkeit, wird diese Reaktionszeit verworfen. Vernachlässigt wird
auch die Latenz der Tastatur. Trotzdem ist das doch ganz brauchbar, oder?
Viele Grüße
Pantau