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


Anmelden zum Antworten