enumerasi DXGI_SWAP_EFFECT (dxgi.h)

Opsi untuk menangani piksel di permukaan tampilan setelah memanggil IDXGISwapChain1::P resent1.

Sintaks

typedef enum DXGI_SWAP_EFFECT {
  DXGI_SWAP_EFFECT_DISCARD = 0,
  DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
  DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
  DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} ;

Konstanta

 
DXGI_SWAP_EFFECT_DISCARD
Nilai: 0
Gunakan bendera ini untuk menentukan model transfer blok bit (bitblt) dan untuk menentukan bahwa DXGI membuang konten buffer belakang setelah Anda memanggil IDXGISwapChain1::P resent1.
Bendera ini berlaku untuk rantai pertukaran dengan lebih dari satu buffer belakang, meskipun, aplikasi hanya memiliki akses baca dan tulis ke buffer 0.
Gunakan bendera ini untuk mengaktifkan driver tampilan untuk memilih teknik presentasi yang paling efisien untuk rantai pertukaran.

Direct3D 12: Nilai enumerasi ini tidak pernah didukung. Aplikasi D3D12 harus menggunakan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL atau DXGI_SWAP_EFFECT_FLIP_DISCARD.

Catatan Ada perbedaan antara layar penuh eksklusif dan UWP layar penuh. Jika Anda memindahkan aplikasi Direct3D 11 ke UWP pada PC Windows, ketahuilah bahwa penggunaan DXGI_SWAP_EFFECT_DISCARD saat membuat rantai pertukaran
tidak berperilaku sama seperti pada UWP di Win32, dan penggunaannya mungkin merugikan performa GPU.

Ini karena aplikasi UWP dipaksa ke mode pertukaran FLIP (bahkan jika mode pertukaran lainnya diatur), karena ini mengurangi komputasi
waktu yang digunakan oleh salinan memori yang awalnya dilakukan oleh model bitblt yang lebih lama.

Pendekatan yang disarankan adalah mengonversi rantai pertukaran Pembuangan DX11 secara manual untuk menggunakan model balik dalam UWP, menggunakan DXGI_SWAP_EFFECT_FLIP_DISCARD alih-alih DXGI_SWAP_EFFECT_DISCARD jika memungkinkan.
Lihat Contoh di bawah ini, dan lihat artikel ini untuk informasi selengkapnya.

 
DXGI_SWAP_EFFECT_SEQUENTIAL
Nilai: 1
Gunakan bendera ini untuk menentukan model bitblt dan untuk menentukan bahwa DXGI mempertahankan konten buffer belakang setelah Anda memanggil IDXGISwapChain1::P resent1.
Gunakan opsi ini untuk menyajikan konten rantai pertukaran secara berurutan, dari buffer pertama (buffer 0) hingga buffer terakhir.
Bendera ini tidak dapat digunakan dengan multisampling.

Direct3D 12: Nilai enumerasi ini tidak pernah didukung. Aplikasi D3D12 harus menggunakan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL atau DXGI_SWAP_EFFECT_FLIP_DISCARD.


Catatan Untuk performa terbaik, gunakan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL alih-alih DXGI_SWAP_EFFECT_SEQUENTIAL. Lihat artikel ini untuk informasi selengkapnya.

 
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL
Nilai: 3
Gunakan bendera ini untuk menentukan model presentasi balik dan untuk menentukan bahwa DXGI mempertahankan konten buffer belakang setelah Anda memanggil IDXGISwapChain1::P resent1. Bendera ini tidak dapat digunakan dengan multisampling.


Direct3D 11: Nilai enumerasi ini didukung dimulai dengan Windows 8.
DXGI_SWAP_EFFECT_FLIP_DISCARD
Nilai: 4
Gunakan bendera ini untuk menentukan model presentasi balik dan untuk menentukan bahwa DXGI membuang konten buffer belakang setelah Anda memanggil IDXGISwapChain1::P resent1.
Bendera ini tidak dapat digunakan dengan multisampling dan presentasi parsial.
Lihat Peningkatan DXGI 1.4.


Direct3D 11: Nilai enumerasi ini didukung dimulai dengan Windows 10.
Bendera ini berlaku untuk rantai pertukaran dengan lebih dari satu buffer belakang; meskipun aplikasi memiliki akses baca dan tulis hanya ke buffer 0.


Catatan Aplikasi Bursa Windows harus menggunakan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL atau DXGI_SWAP_EFFECT_FLIP_DISCARD.

 

Keterangan

Enumerasi ini digunakan oleh struktur DXGI_SWAP_CHAIN_DESC dan DXGI_SWAP_CHAIN_DESC1 .

Di D3D12, hanya DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL dan DXGI_SWAP_EFFECT_FLIP_DISCARD yang didukung, dan model bitblt tidak. Karena itu, multisampling buffer back tidak didukung di D3D12, dan Anda harus melakukan multisampling secara manual di aplikasi menggunakan ID3D12GraphicsCommandList::ResolveSubresource atau ID3D12GraphicsCommandList1::ResolveSubresourceRegion.

Untuk menggunakan multisampling dengan DXGI_SWAP_EFFECT_SEQUENTIAL atau DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, Anda harus melakukan multisampling dalam target render terpisah. Misalnya, buat tekstur multisampel dengan memanggil ID3D11Device::CreateTexture2D dengan struktur D3D11_TEXTURE2D_DESC yang diisi (anggota BindFlags diatur ke anggota D3D11_BIND_RENDER_TARGET dan SampleDesc dengan parameter multisampling). Panggilan berikutnya ID3D11Device::CreateRenderTargetView untuk membuat tampilan target render untuk tekstur, dan merender adegan Anda ke dalam tekstur. Terakhir panggil ID3D11DeviceContext::ResolveSubresource untuk menyelesaikan tekstur multisampled ke dalam rantai pertukaran non-multisampled Anda.

Perbedaan utama antara model presentasi adalah bagaimana konten back-buffer sampai ke Desktop Window Manager (DWM) untuk komposisi. Dalam model bitblt, yang digunakan dengan nilai DXGI_SWAP_EFFECT_DISCARD dan DXGI_SWAP_EFFECT_SEQUENTIAL , konten buffer belakang disalin ke permukaan pengalihan pada setiap panggilan ke IDXGISwapChain1::P resent1. Dalam model flip, yang digunakan dengan nilai DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL , semua buffer belakang dibagikan dengan DWM. Oleh karena itu, DWM dapat menyusun langsung dari buffer belakang tanpa operasi salinan tambahan. Secara umum, model flip adalah model yang lebih efisien. Model flip juga menyediakan lebih banyak fitur, seperti statistik saat ini yang ditingkatkan.

Perbedaan antara DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL dan DXGI_SWAP_EFFECT_FLIP_DISCARD adalah bahwa DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL memaksa DXGI untuk menjamin bahwa konten setiap buffer belakang dipertahankan di seluruh IDXGISwapChain::Present panggilan, sedangkan DXGI_SWAP_EFFECT_FLIP_DISCARD tidak memberikan jaminan ini. Komppositor, dalam skenario tertentu, dapat menggunakan DirectFlip, di mana ia menggunakan buffer kembali aplikasi sebagai seluruh buffer tampilan kembali, yang meningkatkan biaya penyalinan buffer kembali aplikasi ke buffer desktop back akhir. Dengan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL dan DXGI_SWAP_EFFECT_FLIP_DISCARD, pengoptimalan ini dapat terjadi ketika aplikasi adalah satu-satunya item yang terlihat di layar. Namun, bahkan ketika aplikasi bukan satu-satunya item yang terlihat di layar, jika model balik DXGI_SWAP_EFFECT_FLIP_DISCARD, komppositor dapat dalam beberapa skenario masih melakukan pengoptimalan ini, dengan menggambar konten lain ke buffer belakang aplikasi.

Saat Anda memanggil IDXGISwapChain1::P resent1 pada rantai pertukaran model flip (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) dengan 0 yang ditentukan dalam parameter SyncInterval, Perilaku IDXGISwapChain1::P resent1 sama dengan perilaku IDirect3D 9Ex's IDirect3DDevice9Ex::P resentEx dengan D3DSWAPEFFECT_FLIPEX dan D3DPRESENT_FORCEIMMEDIATE. Artinya, runtime tidak hanya menyajikan bingkai berikutnya alih-alih bingkai antrean sebelumnya, runtime juga mengakhiri sisa waktu yang tersisa pada bingkai yang sebelumnya diantrekan.

Terlepas dari apakah model flip lebih efisien, aplikasi masih dapat memilih model bitblt karena model bitblt adalah satu-satunya cara untuk mencampur presentasi GDI dan DirectX. Dalam model flip, aplikasi harus membuat rantai pertukaran dengan DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE, dan kemudian harus menggunakan GetDC pada buffer belakang secara eksplisit. Setelah panggilan pertama yang berhasil ke IDXGISwapChain1::P resent1 pada rantai pertukaran model flip, GDI tidak lagi bekerja dengan HWND yang terkait dengan rantai pertukaran tersebut, bahkan setelah penghancuran rantai pertukaran. Pembatasan ini bahkan meluas ke metode seperti ScrollWindowEx.

Untuk informasi selengkapnya tentang rantai pertukaran model balik dan mengoptimalkan presentasi, lihat Meningkatkan presentasi dengan model balik, persegi panjang kotor, dan area yang digulir.

Contoh

Untuk membuat rantai pertukaran di UWP, Anda hanya perlu membuat instans baru templat DX11 dan melihat implementasi DeviceResources::CreateWindowSizeDependentResources dalam sampel D3D12.

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};

       swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width);    // Match the size of the window.
       swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
       swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;            // This is the most common swap chain format.
       swapChainDesc.Stereo = false;
       swapChainDesc.SampleDesc.Count = 1;                           // Don't use multi-sampling.
       swapChainDesc.SampleDesc.Quality = 0;
       swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       swapChainDesc.BufferCount = 2;                                // Use double-buffering to minimize latency.
       swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;     // All Windows Store apps must use a flip effect.
       swapChainDesc.Flags = 2048;
       swapChainDesc.Scaling = scaling;
       swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;

       // This sequence obtains the DXGI factory that was used to create the Direct3D device above.
       ComPtr<IDXGIDevice3> dxgiDevice;
       DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));

       ComPtr<IDXGIAdapter> dxgiAdapter;
       DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));

       ComPtr<IDXGIFactory4> dxgiFactory;
       DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));

       ComPtr<IDXGISwapChain1> swapChain;
       DX::ThrowIfFailed(
              dxgiFactory->CreateSwapChainForCoreWindow(
                     m_d3dDevice.Get(),
                     reinterpret_cast<IUnknown*>(m_window.Get()),
                     &swapChainDesc,
                     nullptr,
                     &swapChain
                     )
              );

Persyaratan

Persyaratan Nilai
Header dxgi.h

Lihat juga

Enumerasi DXGI

Untuk performa terbaik, gunakan model flip DXGI