Разрыв с VSYNC только в полноэкранном режиме (оконный режим работает нормально) в Windows 10 / DirectX

Я думаю, что мое приложение 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
}

Я что-то пропустил? Или я что-то не так сделал?

1

Решение

Мой комментарий как ответ:

Вы пытались обнулить числитель и знаменатель? Затем DXGI автоматически вычислит правильные значения. (доктор) Ссылка также охватывает, почему 60/1 не должен быть жестко закодирован (может привести к проблемам в некоторых системах).

1

Другие решения


По вопросам рекламы [email protected]