我的DirectX 11应用程序的某些用户抱怨帧速率在1000-2000 fps之间,我完全理解。遇到这个问题的人很少。我能够复制它的唯一方法是通过在Nvidia控制面板中禁用“垂直同步”,我怀疑用户可能已经篡改了这些设置,也许是为了更早解决其他应用程序的问题(或者Nvidia应用程序认为这是最适合该应用程序?)。
我目前在调用DisplayModeList
之前,遍历IDXGIOutput::GetDisplayModeList
中的RefreshRate
以找到最合适的DXGI_SWAP_CHAIN_DESC
分配给D3D11CreateDeviceAndSwapChain()
。
swapChainDesc.BufferDesc.RefreshRate.Numerator = numerator;
swapChainDesc.BufferDesc.RefreshRate.Denominator = denominator;
尽管,即使我将分子和分母分别设置为0和1,驱动程序也将使用VSync并以适当的帧速率(监视器帧速率)运行应用程序。这是使用Nvidia控制面板中的默认设置。
似乎没有视频显示模式或交换链创建设置可以忽略Nvidia控制面板中禁用了VSync的事实。使用GLFW在OpenGL中也存在同样的问题。
一种解决方法是在增量时间很小时让应用程序进入睡眠状态,但不能保证睡眠时间是准确的,并且会导致fps抖动和屏幕撕裂。
我有什么办法可以覆盖Nvidia控制面板中的设置?