如何在 Linux 上获得支持的显示刷新率?
How to get supported display refresh rates on Linux?
来自 DRM 的 drmModeModeInfo
结构包含 uint32_t vrefresh;
字段,并且那里的值实际上很好,即我为不同的视频模式获得 24-75Hz。但是刷新率不是整数,它们是有理数,现在我的显示值是 59997/1000。
是否可以获得 Linux 上的精确数字?或者至少是一个浮点值?
分子为drmModeModeInfo::clock * 1000
,clock
字段单位为千赫兹,公式中需要赫兹。
分母是 drmModeModeInfo::htotal
和 drmModeModeInfo::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;
drmModeModeInfo
结构包含 uint32_t vrefresh;
字段,并且那里的值实际上很好,即我为不同的视频模式获得 24-75Hz。但是刷新率不是整数,它们是有理数,现在我的显示值是 59997/1000。
是否可以获得 Linux 上的精确数字?或者至少是一个浮点值?
分子为drmModeModeInfo::clock * 1000
,clock
字段单位为千赫兹,公式中需要赫兹。
分母是 drmModeModeInfo::htotal
和 drmModeModeInfo::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;