Я думаю, что мое приложение DirectX 11 отлично работало на предыдущей системе (я уверен примерно на 70%). Но теперь в Windows 10 (ноутбук) проблема с разрывом только в полноэкранном режиме (в оконном режиме разрыва нет).
Сцена довольно «тяжелая» (предполагается, что она будет протестирована на производительность для моего приложения). Когда DirectX рендерит более «тяжелые» части, на короткое время частота кадров снижается примерно до 50 кадров в секунду (мои измерения могут быть немного неточными), а затем возвращается к 60-61 кадрам в секунду. Что странно, я не вижу разрывов в "более тяжелых" частях (около 50фпс).
Я слышал, что это может быть как-то связано с 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;
Где numerator
и denominator
рассчитываются на основе этого руководства:
...
numerator = displayModeList[i].RefreshRate.Numerator;
denominator = displayModeList[i].RefreshRate.Denominator;
Который возвращает два очень высоких значения, которые дают около 60
при делении друг на друга (получу ли я тот же эффект, просто установив их в 60
и 1
?):
Я также визуализирую с помощью:
if(VSYNC){
swapChain->Present(1, 0); //lock to screen refresh rate
}else{
swapChain->Present(0, 0); //present as fast as possible
}
Я что-то пропустил? Или я что-то не так сделал?