Nmd*_*ery 5 c++ linux frame-rate xorg
在Windows中,winapi提供了报告有关监视器的信息的功能:
DEVMODE dm;
dm.dmSize = sizeof(DEVMODE);
EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &dm);
int FPS = dm.dmDisplayFrequency;
Run Code Online (Sandbox Code Playgroud)
在Linux上相当于什么?Linux手册页将我定向到allegro库函数,但我不仅不使用allegro,而且该函数来自该库的过时版本,而且据说只能在Windows上运行。
使用 XRandr API (man 3 Xrandr)。请参见此处的示例:
您还可以查看 xrandr(1) 的代码。
编辑1:为了后代:
示例代码略有调整,因此更像是一个演示:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <iostream>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
int main()
{
int num_sizes;
Rotation current_rotation;
Display *dpy = XOpenDisplay(NULL);
Window root = RootWindow(dpy, 0);
XRRScreenSize *xrrs = XRRSizes(dpy, 0, &num_sizes);
//
// GET CURRENT RESOLUTION AND FREQUENCY
//
XRRScreenConfiguration *conf = XRRGetScreenInfo(dpy, root);
short current_rate = XRRConfigCurrentRate(conf);
SizeID current_size_id = XRRConfigCurrentConfiguration(conf, ¤t_rotation);
int current_width = xrrs[current_size_id].width;
int current_height = xrrs[current_size_id].height;
std::cout << "current_rate = " << current_rate << std::endl;
std::cout << "current_width = " << current_width << std::endl;
std::cout << "current_height = " << current_height << std::endl;
XCloseDisplay(dpy);
}
Run Code Online (Sandbox Code Playgroud)
编译:
g++ 17797636.cpp -o 17797636 -lX11 -lXrandr
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./17797636
current_rate = 50
current_width = 1920
current_height = 1080
Run Code Online (Sandbox Code Playgroud)