Direct3D 9: Optimale refresh rate ermitteln



  • Hallo!

    Wie ermittelt man die optimale refresh rate, also die vom Monitor nehme ich an?
    IDirect3D9::EnumAdapterModes gibt einem ja mehrere, aber warum eigentlich? Welchen Sinn hat es, nicht den Monitor-Standard zu verwenden?
    Also ich möchte den Benutzer nicht die refresh rate auswählen lassen, sondern selbst die optimale ermitteln.
    Geht das vllt. mit EnumDisplaySettings? Kann ich dann dmDisplayFrequency einfach für pp.FullScreen_RefreshRateInHz für CreateDevice verwenden?
    Und sind die Indices von EnumDisplayDevices gleich mit denen von IDirect3D9::EnumAdapterModes?

    Danke!



  • Oh und was ist, wenn man mehrere Monitore hat?
    Kann man irgendwie ermitteln, welcher dazu verwendet wird, eine D3D Vollbild-Application anzuzeigen?



  • Es gibt ja Monitore die keine "Default-Frequenz" haben. Ob es eine API gibt mit der man unter Windows die "Default-Frequenz" (falls überhaupt vorhanden) ermitteln kann, weiss ich nicht.
    Lass es den User auswählen, ist ja keine Tragik.
    Ansonsten würde ich vorschlagen:
    Nimm 60 Hz wenn der Monitor genau 60 Hz kann.
    Wenn nicht, nimm die niedrigste Frequenz > 60 Hz.
    Und wenn er keine Frequenz >= 60 kann, dann nimm einfach die höchste Frequenz die er kann.

    Ansonsten kann man bei einigen APIs soweit ich weiss auch einfach 0 für "ist mir egal, nimm was du für das beste hältst" als Frequenz angeben.

    mhat schrieb:

    Oh und was ist, wenn man mehrere Monitore hat?
    Kann man irgendwie ermitteln, welcher dazu verwendet wird, eine D3D Vollbild-Application anzuzeigen?

    Wie, welcher dafür verwendet wird?
    Der Benutzer erwartet sich normalerweise dass D3D Fullscreen Applikationen am primären Bildschirm angezeigt werden (=der mit den Desktop-Koordinaten 0, 0) -- ganz einfach weil die meisten Programme das so machen. Du kannst es den Benutzer aber natürlich auch auswählen lassen.



  • Wenn du CreateDevice aufrufst, einfach VSync einschalten bzw das sollte default sein. Wozu brauchst du die Refresh rate?

    http://msdn.microsoft.com/en-us/library/windows/desktop/bb172585
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb174313



  • @Scorcher24
    Es gibt (LCD) Bildschirme die z.B. 60 und 75 Hz können, bei Betrieb mit 75 Hz aber "stottern". Weil sie nur mit 75 Hz in ihren Framebuffer schreiben, den Bildaufbau dann aber trotzdem mit 60 Hz machen. Das ist doof. Daher ist es gut die "optimale" Refresh-Rate des Monitors zu verwenden.

    Wobei solche Monitore vermutlich mittlerweile eher selten sind - hoffe ich zumindest.



  • hustbaer schrieb:

    @Scorcher24
    Es gibt (LCD) Bildschirme die z.B. 60 und 75 Hz können, bei Betrieb mit 75 Hz aber "stottern". Weil sie nur mit 75 Hz in ihren Framebuffer schreiben, den Bildaufbau dann aber trotzdem mit 60 Hz machen. Das ist doof. Daher ist es gut die "optimale" Refresh-Rate des Monitors zu verwenden.

    Wobei solche Monitore vermutlich mittlerweile eher selten sind - hoffe ich zumindest.

    Gut, das macht Sinn. Hör ich aber das erste mal :D.

    Ansonsten findet man die Frequenz im DEVMODE struct von EnumDisplaySettings über den Parameter dmDisplayFrequency. Aber das weiss er ja schon :).
    http://msdn.microsoft.com/en-us/library/dd162611



  • Gerade bei video-typischen Auflösung (1920x1080, 1280x720, 720x480) bieten manche Bildschirm die ganzen PAL/NTSC Refresh-Raten an (25/29.97/30/50 Hz) - die will natürlich kein Mensch wirklich haben.

    Darum gehe ich immer davon aus, dass der Desktop mit der nativen Refresh-Rate läuft.
    Wenn man dann eine andere Auflösung wählen möchte (was heute kaum noch Sinn macht), nehme ich die Desktop-Rate als Default an. Bei analogen Bildschirmen kann es natürlich eine geeignetere geben - das muss der Benutzer dann halt selber wissen und eine andere auswählen.

    Genauso gehe ich auch mit der Aspect-Ratio um - bei einer Desktopauflösung von 1680x1050 wird zB. 16:10 angenommen.
    Es gibt zwar einige wenige Bildschirme die kein 1:1-Pixelverhältnis haben aber dann muss der Benutzer eben auch korrigieren.



  • hellihjb schrieb:

    Darum gehe ich immer davon aus, dass der Desktop mit der nativen Refresh-Rate läuft.
    Wenn man dann eine andere Auflösung wählen möchte (was heute kaum noch Sinn macht), nehme ich die Desktop-Rate als Default an. Bei analogen Bildschirmen kann es natürlich eine geeignetere geben - das muss der Benutzer dann halt selber wissen und eine andere auswählen.

    Das ist gut.
    Könnte man auch mit meimen "Algorithmus" kombinieren: einfach "60Hz" durch "Desktop-Rate" ersetzen.


Log in to reply