为什么在DirectX11中全屏不关闭VSync?

我在DirectX11的引擎中遇到一个奇怪的问题。当我在窗口中运行游戏时,可以很好地启用或禁用VSync。但是,当游戏的分辨率与屏幕分辨率相同时,VSync总是处于打开状态。独家全屏和无边界窗口全屏都会发生这种情况。

例如,我的显示器是1920 * 1200。如果我在1920 * 1200的无边框窗口全屏模式下的DirectX11中运行,我总是会获得60fps(因此vsync显然处于打开状态)。如果我在1920 * 1080上运行,则可以关闭vsync并获取其他帧速率(例如250fps,因此vsync确实处于关闭状态)。

我已经在一台以上的计算机上看到了这一点,但是我不知道它是否在所有计算机上都发生。

我们的引擎还支持DirectX9和OpenGL,并且在那里没有发生问题:无论分辨率如何,我都可以在此处打开和关闭VSync。

我分别通过调用以下两者之一来打开和关闭VSync:

swapChain->Present(1,0); //on
swapChain->Present(0,0); //off

我这样创建swapChain:

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};
swapChainDesc.Width = windowWidth;
swapChainDesc.Height = windowHeight;
swapChainDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.Stereo = false;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 2;
swapChainDesc.Scaling = DXGI_SCALING_STRETCH;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
swapChainDesc.flags = 0;
SDL_SysWMinfo& windowInfo = getWindowInfo();
IDXGISwapChain1* swapChain = nullptr;
dxgiFactory->CreateSwapChainForHwnd(device,windowInfo .info.win.window,&swapChainDesc,nullptr,&swapChain);

我在这里做错了什么?为什么仅在游戏不能覆盖整个屏幕时才关闭VSync?

iCMS 回答:为什么在DirectX11中全屏不关闭VSync?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2164494.html

大家都在问