微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何找出真正的屏幕刷新率而不是整数

根据微软的这篇文章用户设置的屏幕刷新率可以是(而且大部分是)一个分数。 用户设置59Hz,屏幕按60Hz的屏幕显示运行,但实际上是59.94Hz。 我需要一个非常stream畅的animation是59.94Hz。

使用IDirect3DDevice9 :: GetdisplayMode我只能得到一个int值,不能通过定义代表真正的时间( EnumdisplaySettings也是如此 )。 我每秒都会遇到一个可见的口吃,因为它报告了四舍五入/截断的59.如果我手动将我的应用程序中报告的时间更正为59.94,它会平稳运行。

任何人都知道我可以如何检索真正的屏幕刷新率?

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

为什么Direct3D只能在Windows上工作?

OpenGL闪烁/损坏与窗口resize和DWM活动

报告Direct3D内存使用情况

如何获取dxgi显示器/输出的当前显示模式(分辨率,刷新率)?

如何在透明窗口中绘制透明的DirectX内容

用GDI画出opengl / D3D?

当Windows UAC提示被触发时是否有WinAPI消息?

在windows / direct3d中使用ttf文件中的字体

食人魔和快板direct3d设备9冲突

保持全屏的XNA游戏在上面

如果您的目标是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来确保你从任何虚假的故障中恢复,否则你会最终落后一帧。

祝你好运!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐