C++ 在Windows 10/DirectX上,仅在全屏模式下使用VSYNC(窗口模式工作正常)

C++ 在Windows 10/DirectX上,仅在全屏模式下使用VSYNC(窗口模式工作正常),c++,directx,directx-11,dwm,vsync,C++,Directx,Directx 11,Dwm,Vsync,我认为我的DirectX 11应用程序在以前的系统上运行得很好(我大约70%确定)。但是现在,在Windows 10(笔记本电脑)中,我只有在全屏模式下出现撕裂问题(窗口模式工作时没有任何撕裂) 场景相当“沉重”(应该对我的应用程序进行性能测试)。当DirectX渲染“较重”的部分时,它在短时间内下降到大约50fps(我的测量可能有点不准确),然后又回到60-61fps。奇怪的是,我没有看到“较重”的部件(约50帧/秒)撕裂 我听说它可能与DWM有关,DWM为窗口化应用程序提供自己的同步(这就是

我认为我的DirectX 11应用程序在以前的系统上运行得很好(我大约70%确定)。但是现在,在Windows 10(笔记本电脑)中,我只有在全屏模式下出现撕裂问题(窗口模式工作时没有任何撕裂)

场景相当“沉重”(应该对我的应用程序进行性能测试)。当DirectX渲染“较重”的部分时,它在短时间内下降到大约50fps(我的测量可能有点不准确),然后又回到60-61fps。奇怪的是,我没有看到“较重”的部件(约50帧/秒)撕裂

我听说它可能与DWM有关,DWM为窗口化应用程序提供自己的同步(这就是为什么我的程序在窗口化模式下工作正常?)

我能做些什么?

交换链:

DXGI_SWAP_CHAIN_DESC sd;
ZeroMemory(&sd, sizeof(sd));
sd.BufferCount = 1;
sd.BufferDesc.Width = width;
sd.BufferDesc.Height = height;
sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = numerator;
sd.BufferDesc.RefreshRate.Denominator = denominator;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.OutputWindow = *hwnd;
sd.SampleDesc.Count = sampleCount; //1 (and 0 for quality) to turn off multisampling
sd.SampleDesc.Quality = maxQualityLevel;
sd.Windowed = fullScreen ? FALSE : TRUE;
sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; //allow full-screen switchin

// Set the scan line ordering and scaling to unspecified.
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
// Discard the back buffer contents after presenting.
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
其中,
分子
分母
的计算基于:

它返回两个非常高的值,当它们被彼此除以时,得到大约
60
(我是否可以通过将它们设置为
60
1
,获得相同的效果):

我还提出:

if(VSYNC){
    swapChain->Present(1, 0); //lock to screen refresh rate
}else{
    swapChain->Present(0, 0); //present as fast as possible
}

我错过什么了吗?还是我做错了什么?

我的评论作为回答:


你试过把分子和分母归零吗?然后,DXGI将自动计算正确的值。()该链接还介绍了为什么60/1不应该硬编码(可能会导致某些系统出现问题)


你试过把分子和分母归零吗?然后,DXGI将自动计算正确的值。(链接)也包括,为什么60/1不应该硬编码(可能导致一些系统上的问题)。@ GNIETHOWO,我几乎可以肯定我不使用DXGI(据我所知,我在我的C++应用中使用DirectX 11,而没有DXGI,它是一些任务的可选的“包装器”,但也许我错了。无论如何,谢谢你的链接。我现在知道为什么不硬编码60/1,但为什么我的计算方法会引起问题?我不希望开始使用DXGI只是为了获取分子/分母值(复杂性等)。DXGI是一种API,用于处理Windows Vista+的交换链和设备枚举,并显式用于Direct3D 10、11和12。你应该读这篇文章。我认为你把DXGI和D3DX助手方法搞混了。正如Chuck Walbourn所说,您已经在使用DXGI,因为它是windows中所有图形相关api的元api,如Direct3D、Direct2D、DirectWrite等@Gnietschow的确,您是对的。把事情设置为0/0,你能从你的评论中做出回答吗?无论如何,为什么我获取这些值的方法(从教程中获取的方法)失败了?
if(VSYNC){
    swapChain->Present(1, 0); //lock to screen refresh rate
}else{
    swapChain->Present(0, 0); //present as fast as possible
}