Qt - natywny Refresh Rate monitora - skąd te zmiennoprzecinkowe wartości?

Qt - natywny Refresh Rate monitora - skąd te zmiennoprzecinkowe wartości?
ReallyGrid
  • Rejestracja: dni
  • Ostatnio: dni
0

Korzystając z Qt, chciałem ostatnio sprawdzić jak odczytać odświeżanie natywne monitora na którym uruchamiana jest apka. Oczywiście sprawdziłem w specyfikacji producenta jakie odświeżanie ma mój monitor (i monitor laptopa) ale chciałem się dowiedzieć jaką metodą sprawdzić to w Qt. No i sprawdziłem. No i... trochę się zdziwiłem wynikiem. A mianowicie korzystając z tego jakże prostego kodu liczyłem że pokaże wartości spodziewane tj. 75 oraz 60 (Hz).

Kopiuj
#include <QApplication>
#include <QScreen>
#include <QDebug>

int main(int argc, char* argv[]) {
    QApplication application(argc, argv);
    
    qDebug() << "Primary screen:" << QApplication::primaryScreen()->refreshRate();
    qDebug() << "Secondary screen:" << QApplication::screens()[1]->refreshRate();
    
    return QApplication::exec();
}

A pokazuje się coś takiego:

Kopiuj
Primary screen: 74.9681
Secondary screen: 60.0562

Niby proste zaokrąglenie załatwia sprawę ale bardziej interesuje mnie skąd takie wartości? To producenci monitorów zaokrąglają prawdziwy Refresh Rate czy przeciwnie, to Qt wyświetla jakoś dziwacznie (błędy zaokrągleń czy co)?
Dodam, że te wartości pokazywane są za każdym razem. To nie jest tak, że z każdym uruchomieniem apki się minimalnie zmieniają. Cały czas są takie same.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
2

Dokumentacja Qt wspomina, że refreshRate jest przybliżony - na jakiej platformie uruchamiasz kod?

ReallyGrid
  • Rejestracja: dni
  • Ostatnio: dni
0

Kubuntu 22.04. Wiem, że jest tak napisane ale zazwyczaj oczekuje się, że przybliżenie oznacza uproszczenie, tj. przybliża sie raczej liczby zmiennoprzecinkowe do całkowitych, a nie całkowite do zmiennoprzecinkowych

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

Przybliżona, nie zaokrąglona. Odświeżanie nie będzie nigdy idealne co do milionowej części Hz, ciężko je jest też tak dokładnie zmierzyć; w dobie monitorów crt było zależne od częstotliwości prądu w gniazdku.
https://forums.blurbusters.com/viewtopic.php?t=3083

Po prostu sobie zaokrąglij.

ReallyGrid
  • Rejestracja: dni
  • Ostatnio: dni
0

Ok, dzięki. Nie jest to mi do szczęścia potrzebne ale taką zagwostkę niedawno miałem wiec postanowiłem zapytać. Jeszcze raz dzięki za odpowiedzi

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
0

To i tak jest względnie dobrze, że otrzymujesz jałową wartość. Bo np. w SDL można sobie przeiterować po urządzeniach i wspieranych przez nie trybach wideo i dla każdego trybu odczytać sobie częstotliwość odświeżania — a ta jest intem, więc już zaokrąglona. U mnie daje takie wyniki (SDL):

Kopiuj
Video displays: 2

Display 0 (LCD 1280x800), 13 resolutions:

 0:  1280x800 (60Hz)
 1:  1280x768 (60Hz)
 2:  1280x720 (60Hz)
 3:  1024x768 (60Hz)
 4:   960x600 (60Hz)
 5:   800x600 (60Hz)
 6:   768x480 (60Hz)
 7:   640x480 (60Hz)
 8:   640x400 (60Hz)
 9:   512x384 (60Hz)
10:   400x300 (60Hz)
11:   320x240 (60Hz)
12:   320x200 (60Hz)

Display 1 (Generic PnP Monitor), 24 resolutions:

 0: 1280x1024 (76Hz)
 1: 1280x1024 (75Hz)
 2: 1280x1024 (60Hz)
 3:  1280x800 (75Hz)
 4:  1280x800 (60Hz)
 5:  1280x768 (75Hz)
 6:  1280x768 (60Hz)
 7:  1280x720 (75Hz)
 8:  1280x720 (60Hz)
 9:  1024x768 (75Hz)
10:  1024x768 (60Hz)
11:   960x600 (60Hz)
12:   800x600 (75Hz)
13:   800x600 (60Hz)
14:   768x480 (60Hz)
15:   656x496 (60Hz)
16:   640x480 (75Hz)
17:   640x480 (60Hz)
18:   640x480 (59Hz)
19:   640x400 (70Hz)
20:   512x384 (70Hz)
21:   400x300 (70Hz)
22:   320x240 (70Hz)
23:   320x200 (70Hz)

CIekawe czy np. 18: 640x480 (59Hz) to wynik zaokrąglenia, czy faktycznie jest to niemal równo 59Hz.

Nie wiem tylko czy surowa wartość w formie floata jest do czegokolwiek potrzebna. Gdyby trzeba było dopasować framerate do refresh rate'u (bez używania VSynca) to by się to przydało, ale do typowych zastosowań wystarczy int.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.