在Windows 10 / DirectX

时间:2015-08-01 12:22:20

标签: c++ directx directx-11 dwm vsync

我认为我的DirectX 11应用程序在以前的系统上运行良好(我大约70%肯定)。但现在,在Windows 10(笔记本电脑)我只在全屏模式下撕裂问题(窗口模式无需任何撕裂)。

场景非常“沉重”(它应该是我的应用程序的性能测试)。当DirectX呈现“较重”的部分时,它会在短时间内下降到大约50fps(我的测量可能有点不准确)然后又回到60-61fps。奇怪的是,我不会在“较重”的部分(大约50fps)看到撕裂。

我听说它可能与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;

根据this tutorial

计算numeratordenominator的位置
...
numerator = displayModeList[i].RefreshRate.Numerator;
denominator = displayModeList[i].RefreshRate.Denominator;

哪个会返回两个非常高的值,这些值在相互分开时会提供60(只需将它们设置为601,我会得到相同的效果吗?):

enter image description here

我也用:

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

我错过了什么吗?或者我做错了什么?

1 个答案:

答案 0 :(得分:1)

我的评论作为答案:

  

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