加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 如何找出真正的屏幕刷新率(不是舍入的数字)

发布时间:2020-12-13 22:34:05 所属栏目:Windows 来源:网络整理
导读:根据 this article by Microsoft,用户设置的屏幕刷新率可以是(并且大部分)是分数.用户设置59Hz,但屏幕按60Hz的屏幕显示运行,但实际上它是59.94Hz.我非常流畅的动画需要的是59.94Hz. 使用IDirect3DDevice9::GetDisplayMode我只得到一个int值,根据定义,它不能
根据 this article by Microsoft,用户设置的屏幕刷新率可以是(并且大部分)是分数.用户设置59Hz,但屏幕按60Hz的屏幕显示运行,但实际上它是59.94Hz.我非常流畅的动画需要的是59.94Hz.

使用IDirect3DDevice9::GetDisplayMode我只得到一个int值,根据定义,它不能代表真正的时间(EnumDisplaySettings也是如此).我遇到一个关于每一秒的明显口吃,因为它报告圆形/截断59.如果我手动将我的应用程序中报告的时间校正到59.94,它会顺利运行.

有谁知道如何检索真正的屏幕刷新率?

我目前的解决方法是将60Hz和59Hz都映射到恒定的59.94Hz,但这并不令人满意.

解决方法

如果您的目标是Windows Vista或更高版本,则答案取决于您的应用运行的模式.

如果是窗口应用程序(或全窗口窗口),则根据用户设置和其他因素通过桌面窗口管理器(DWM)控制刷新率.使用DwmGetCompositionTimingInfo并查看DWM_TIMING_INFO :: rateRefresh以获取监视器刷新率.

如果应用程序是全屏幕,则您创建的全屏交换链将覆盖系统默认值.但是,您选择的刷新率(DXGI_SWAP_CHAIN_FULLSCREEN_DESC :: RefreshRate)应与监视器支持的刷新率之一匹配.您可以使用IDXGIOutput::GetDisplayModeList获取支持的刷新率列表.以下是如何执行此操作的示例:

UINT numModes = 0;
dxgiOutput->GetDisplayModeList(DXGI_FORMAT_B8G8R8A8_UNORM,&numModes,NULL);
DXGI_MODE_DESC* modes = new DXGI_MODE_DESC[numModes];
dxgiOutput->GetDisplayModeList(DXGI_FORMAT_B8G8R8A8_UNORM,modes);
// see modes[i].RefreshRate

在任何情况下,如果你是三重缓冲,你不应该看到故障.您应该尽可能快地出现,操作系统将按时出现.如果你将三重缓冲与自定义管理帧定时相结合,你可以保证不会实际获得三重缓冲,并且你会在vblank阶段出现任何漂移时出现故障(即使你有一个完美的值,它也会逐渐发生)刷新率).如果你想坚持三重缓冲,只要尽可能快地出现,让操作系统负责演示时间.如果您使用自己的计时来驱动Present()(例如,获得低延迟响应),则应该在另一个线程上调用IDXGIOutput::WaitForVBlank来帮助同步帧时序.如果你最终这样做,你也应该使用IDXGISwapChain::GetFrameStatistics来确保你从任何虚假故障中恢复过来,否则你最终会落后一帧.

祝好运!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读