Bagikan melalui


Laju refresh variabel ditampilkan

Tampilan laju refresh variabel memerlukan robek untuk diaktifkan, ini juga dikenal sebagai dukungan "vsync-off".

Laju refresh variabel ditampilkan/Vsync nonaktif

Dukungan untuk tampilan kecepatan refresh variabel dicapai dengan mengatur bendera tertentu saat membuat dan menyajikan rantai pertukaran.

Untuk menggunakan fitur ini, pengguna aplikasi harus berada di sistem Windows 10 dengan KB3156421 atau Pembaruan Hari Jadi terinstal. Fitur ini berfungsi pada semua versi Direct3D 11 dan 12 menggunakan efek pertukaran DXGI_SWAP_EFFECT_FLIP_* .

Untuk menambahkan dukungan vsync-off ke aplikasi, Anda dapat merujuk ke sampel lengkap yang berjalan untuk Direct3D 12, D3D12Fullscreen (lihat Sampel Kerja). Ada juga beberapa poin yang tidak secara eksplisit dipanggil dalam kode sampel tetapi Anda perlu memperhatikannya.

  • ResizeBuffers (atau ResizeBuffers1) harus memiliki bendera pembuatan rantai pertukaran (DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING) yang sama yang diteruskan ke dalamnya sebagai Present (atau Present1).
  • DXGI_PRESENT_ALLOW_TEARING hanya dapat digunakan dengan interval sinkronisasi 0. Disarankan untuk selalu meneruskan bendera merobek ini saat menggunakan interval sinkronisasi 0 jika CheckFeatureSupport melaporkan bahwa robek didukung dan aplikasi dalam mode berjendela - termasuk mode layar penuh tanpa batas. Lihat konstanta DXGI_PRESENT untuk detail selengkapnya.
  • Menonaktifkan vsync tidak selalu membuka laju bingkai Anda: pengembang juga perlu memastikan Panggilan hadir tidak dibatasi oleh peristiwa pengaturan waktu lainnya (seperti CompositionTarget::Rendering peristiwa di aplikasi berbasis XAML).

Kode di bawah ini merekap beberapa bagian utama yang perlu Anda tambahkan ke aplikasi Anda.

//--------------------------------------------------------------------------------------------------------
// Check Tearing Support
//--------------------------------------------------------------------------------------------------------

// Determines whether tearing support is available for fullscreen borderless windows.

void DXSample::CheckTearingSupport()
{
// Rather than create the 1.5 factory interface directly, we create the 1.4
// interface and query for the 1.5 interface. This will enable the graphics
// debugging tools which might not support the 1.5 factory interface.

    ComPtr<IDXGIFactory4> factory4;
    HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory4));
    BOOL allowTearing = FALSE;
    if (SUCCEEDED(hr))
    { 
        ComPtr<IDXGIFactory5> factory5;
        hr = factory4.As(&factory5);
        if (SUCCEEDED(hr))
        {
            hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing));
        }
    }
    m_tearingSupport = SUCCEEDED(hr) && allowTearing;
}

//--------------------------------------------------------------------------------------------------------
// Set up swapchain properly
//--------------------------------------------------------------------------------------------------------

// It is recommended to always use the tearing flag when it is supported.
swapChainDesc.Flags = m_tearingSupport ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0;

//--------------------------------------------------------------------------------------------------------
// Present
//--------------------------------------------------------------------------------------------------------

UINT presentFlags = (m_tearingSupport && m_windowedMode) ? DXGI_PRESENT_ALLOW_TEARING : 0;

// Present the frame.
ThrowIfFailed(m_swapChain->Present(0, presentFlags));

Peningkatan DXGI 1.5

Panduan Pemrograman untuk DXGI