根据微软的这篇文章 http://support.microsoft.com/kb/2006076/en-us用户设置的屏幕刷新率可以(并且大部分是)小数。用户设置为 59Hz,但屏幕按照屏幕显示 60Hz 运行,但实际上是 59.94Hz。我需要 59.94Hz 才能获得极其流畅的动画。
Using IDirect3DDevice9::获取显示模式 http://msdn.microsoft.com/en-us/library/windows/desktop/bb174387%28v=vs.85%29.aspx我只得到一个int根据定义不能代表真实时间的值(同样适用枚举显示设置 http://msdn.microsoft.com/en-us/library/dd162611%28v=VS.85%29.aspx)。我每秒都会遇到明显的卡顿,因为它报告四舍五入/截断的 59。如果我手动将应用程序中报告的计时更正为 59.94,它会运行顺利。
有人知道如何检索真实的屏幕刷新率吗?
我当前的解决方法是将 60Hz 和 59Hz 都映射到恒定的 59.94Hz,但这并不令人满意。
如果您的目标是 Windows Vista 或更高版本,则答案取决于您的应用程序运行的模式。
如果它是窗口应用程序(或全屏窗口),刷新率是根据用户设置和其他因素通过桌面窗口管理器(DWM)控制的。使用DwmGetCompositionTimingInfo http://msdn.microsoft.com/en-us/library/windows/desktop/aa969514%28v=vs.85%29.aspx并查看 DWM_TIMING_INFO::rateRefresh 以获取监视器刷新率。
如果应用程序是真正的全屏,那么您创建的全屏交换链将覆盖系统默认值。但是,您选择的刷新率 (DXGI_SWAP_CHAIN_FULLSCREEN_DESC::RefreshRate) 应与显示器支持的刷新率之一匹配。您可以使用以下命令获取支持的刷新率列表IDXGIOutput::获取显示模式列表 http://msdn.microsoft.com/en-us/library/windows/desktop/bb174549%28v=vs.85%29.aspx。以下是如何执行此操作的示例:
UINT numModes = 0;
dxgiOutput->GetDisplayModeList(DXGI_FORMAT_B8G8R8A8_UNORM, 0, &numModes, NULL);
DXGI_MODE_DESC* modes = new DXGI_MODE_DESC[numModes];
dxgiOutput->GetDisplayModeList(DXGI_FORMAT_B8G8R8A8_UNORM, 0, &numModes, modes);
// see modes[i].RefreshRate
无论如何,如果您是三重缓冲的,您就不应该看到故障。您应该尽可能快地呈现,操作系统就会按时呈现。如果将三重缓冲与自定义托管帧计时相结合,则保证实际上不会获得三重缓冲,并且只要 vblank 阶段出现漂移,您就会遇到故障(即使您具有完美的值,这种情况也会逐渐发生)刷新率)。如果您想坚持使用三重缓冲,请尽可能快地呈现,并让操作系统负责呈现时间。如果您使用自己的计时来驱动 Present()(例如,为了获得低延迟响应),您应该调用IDXGIOutput::等待VBlank http://msdn.microsoft.com/en-us/library/windows/desktop/bb174559%28v=vs.85%29.aspx在另一个线程上帮助同步帧时序。如果你最终这样做了,你也应该使用IDXGISwapChain::GetFrameStatistics http://msdn.microsoft.com/en-us/library/windows/desktop/bb174573%28v=vs.85%29.aspx确保您从任何虚假故障中恢复过来,否则您最终会落后一帧。
祝你好运!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)