如何在 Linux 上获得支持的显示刷新率?

How to get supported display refresh rates on Linux?

来自 DRM

drmModeModeInfo 结构包含 uint32_t vrefresh; 字段,并且那里的值实际上很好,即我为不同的视频模式获得 24-75Hz。但是刷新率不是整数,它们是有理数,现在我的显示值是 59997/1000。

是否可以获得 Linux 上的精确数字?或者至少是一个浮点值?

分子为drmModeModeInfo::clock * 1000clock字段单位为千赫兹,公式中需要赫兹。

分母是 drmModeModeInfo::htotaldrmModeModeInfo::vtotal 字段的乘积。

为了获得更好的结果,我通过将分子和分母除以它们的最大公约数来简化有理数。对于这部分,我使用了 algorithm from Wikipedia.

我不确定当前的显示器是否支持高于 2^32 Hz = 4.29 GHz 的信号频率,但即使它们不支持,未来的显示器也可能支持,即你最好在那里使用 64 位整数数学。

我只是用这个:

drmModeModeInfoPtr mode = 0;
.
.
double freq = mode->clock * 1000.0f / (mode->htotal * mode->vtotal);
freq = round(freq * 1000.0f) / 1000.0f;