enumerasi DXGI_SWAP_EFFECT (dxgi.h)
Opsi untuk menangani piksel di permukaan tampilan setelah memanggil IDXGISwapChain1::P resent1.
Sintaksis
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 bit-block (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.
Note Ada perbedaan antara antarmuka pengguna layar penuh eksklusif dan 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 berulah dengan cara yang sama dalam UWP seperti halnya 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 awalnya dilakukan oleh model bitblt yang lebih lama. Pendekatan yang disarankan adalah mengonversi rantai pertukaran DX11 Membuang 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 Penyempurnaan 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 Windows Store harus menggunakan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL atau DXGI_SWAP_EFFECT_FLIP_DISCARD. |
Komentar
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 masuk 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 balik, 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 penyalinan 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 panggilan IDXGISwapChain::Present
, sedangkan DXGI_SWAP_EFFECT_FLIP_DISCARD tidak memberikan jaminan ini. Komppositor, dalam skenario tertentu, dapat menggunakan DirectFlip, di mana ia menggunakan buffer belakang aplikasi sebagai seluruh buffer belakang tampilan, yang meningkatkan biaya penyalinan buffer belakang aplikasi ke buffer belakang desktop 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 flip 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 ditentukan dalam parameter SyncInterval, perilakuIDXGISwapChain1::P resent1 sama dengan perilaku Direct3D 9ExIDirect3DDevice9Ex::P resentEx dengan D3DSWAPEFFECT_FLIPEX dan D3DPRESENT_FORCEIMMEDIATE. Artinya, runtime tidak hanya menyajikan bingkai berikutnya alih-alih bingkai antrean sebelumnya, itu 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 swap dengan DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE, dan kemudian harus menggunakan GetDC di buffer belakang secara eksplisit. Setelah panggilan pertama yang berhasil untuk IDXGISwapChain1::P resent1 pada rantai pertukaran model balik, GDI tidak lagi bekerja dengan HWND yang terkait dengan rantai pertukaran itu, bahkan setelah penghancuran rantai pertukaran. Pembatasan ini bahkan meluas ke metode seperti ScrollWindowEx.
Untuk menampilkan format penyangga swapchain HDR dan ruang warna, diperlukan model flip. Jika tidak, mereka akan disusun (dan diklip) di SDR (sRGB dengan rentang 0-1).
Untuk informasi selengkapnya tentang rantai pertukaran model balik dan mengoptimalkan presentasi, lihat Meningkatkan presentasi dengan model balik, persegi panjang kotor, dan area bergulir.
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
Syarat | Nilai |
---|---|
Header | dxgi.h |