Bagikan melalui


Rantai Pertukaran

Rantai pertukaran mengontrol rotasi buffer belakang, membentuk dasar animasi grafis.

Gambaran Umum

Model pemrograman untuk rantai pertukaran di Direct3D 12 tidak identik dengan yang ada di versi D3D sebelumnya. Kenyamanan pemrograman, misalnya, mendukung rotasi sumber daya otomatis yang ada di D3D10 dan D3D11 tidak lagi didukung. Rotasi sumber daya otomatis mengaktifkan aplikasi untuk merender objek API yang sama sementara permukaan aktual yang dirender mengubah setiap bingkai. Perilaku rantai pertukaran diubah dengan Direct3D 12 untuk memungkinkan fitur lain dari Direct3D 12 memiliki overhead CPU yang rendah. Kunci warna otomatis dan multisampling tidak didukung, meskipun terutama peregangan dan rotasi masih ada.

Masa pakai buffer

Aplikasi diizinkan untuk menyimpan deskriptor yang telah dibuat sebelumnya yang mereferensikan kembali buffer Ini diaktifkan dengan memastikan bahwa set buffer yang dimiliki oleh rantai pertukaran tidak pernah berubah selama masa pakai rantai pertukaran. Kumpulan buffer yang dikembalikan oleh IDXGISwapChain::GetBuffer tidak berubah sampai API tertentu dipanggil:

Urutan buffer yang dikembalikan oleh GetBuffer tidak pernah berubah.

IDXGISwapChain3::GetCurrentBackBufferIndex mengembalikan indeks buffer belakang saat ini ke aplikasi.

Efek pertukaran

Satu-satunya efek pertukaran yang didukung adalah DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL dan DXGI_SWAP_EFFECT_FLIP_DISCARD, yang membutuhkan jumlah buffer lebih besar dari satu.

Transisi antara mode berjendela dan layar penuh

Direct3D 12 tidak mendukung mode eksklusif layar penuh (FSE). Sebaliknya, ketika game adalah satu-satunya aplikasi yang terlihat di layar, OS menggunakan strategi yang disebut pengoptimalan layar penuh (FSO) untuk mencapai efek yang sama dengan FSE tanpa kelemahan performa. Untuk informasi selengkapnya tentang FSO, lihat Mendemystifying Pengoptimalan Layar Penuh.

Direct3D 12 mempertahankan pembatasan bahwa aplikasi harus memanggil ResizeBuffers setelah transisi antara mode berjendela dan layar penuh (rantai pertukaran model balik D3D11 memiliki batasan yang sama).

Transisi IDXGISwapChain::SetFullscreenState tidak mengubah set buffer yang terlihat aplikasi dalam rantai pertukaran. Hanya panggilan ResizeBuffers dan ResizeTarget yang membuat atau menghancurkan buffer yang terlihat aplikasi. Namun, dalam Direct3D 12 IDXGISwapChain::SetFullscreenState tidak memasuki mode eksklusif layar penuh, dan hanya mengubah resolusi dan kecepatan refresh untuk memungkinkan pengoptimalan layar penuh. Perubahan ini dapat dilakukan oleh aplikasi tanpa menggunakan metode ini

Ketika atau IDXGISwapChain::P resent atau IDXGISwapChain1::P resent dipanggil, buffer belakang yang akan disajikan harus dalam status D3D12_RESOURCE_STATE_PRESENT . Ada akan gagal dengan DXGI_ERROR_INVALID_CALL jika ini tidak terjadi.

Rantai pertukaran layar penuh terus memiliki batasan bahwa SetFullscreenState(FALSE, NULL) harus dipanggil sebelum rilis akhir rantai pertukaran. SetFullscreenState(FALSE) berhasil pada rantai pertukaran yang berjalan di perangkat Direct3D 12.

Operasi saat ini terjadi pada antrean 3D yang disediakan pada pembuatan swapchain, dan aplikasi bebas untuk secara bersamaan menyajikan beberapa rantai pertukaran, dan merekam dan menjalankan daftar perintah.

Ketika bagian akhir dari pekerjaan grafis (misalnya, bingkai pascaproses) dilakukan pada antrean komputasi, atau tidak melibatkan antrean grafis perangkat, membuat antrean 3D kedua untuk disajikan dapat bermanfaat dan mencegah latensi presentasi menunda awal bingkai berikutnya.

Contoh

Contoh kode berikut akan ada dalam perulangan penyajian utama:

void Present()
{
    m_swapChain->Present(0, m_presentFlags);
    m_backBufferIndex = (m_backBufferIndex + 1) % m_backBufferCount;
}

Membuat rantai pertukaran

Saat menggunakan panggilan CreateSwapChainForHwnd, CreateSwapChainForCoreWindow, atau CreateSwapChainForComposition , perhatikan bahwa parameter pDevice benar-benar memerlukan pointer ke antrean perintah langsung di Direct3D 12, dan bukan perangkat.

Menyajikan di Windows 7

Saat menargetkan Direct3D 12 pada Windows 7, jenis DXGI yang diperlukan untuk Direct3D 12 tidak ada, jadi Anda harus menggunakan ID3D12On7 yang disediakan D3D12CommandQueueDownLevel (dikueri dari antrean perintah langsung) untuk menyajikan.

Anda menyediakan daftar perintah terbuka ke metode saat ini Windows 7, yang kemudian akan digunakan, ditutup, dan secara otomatis dikirimkan ke perangkat untuk Anda. Anda harus menyediakan buffer belakang yang harus dibuat aplikasi, harus merupakan sumber daya yang berkomitmen, harus diambil sampel tunggalnya, dan harus merupakan salah satu format berikut.

  • DXGI_FORMAT_R16G16B16A16_FLOAT
  • DXGI_FORMAT_R10G10B10A2_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM
  • DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  • DXGI_FORMAT_B8G8R8X8_UNORM
  • DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM
  • DXGI_FORMAT_B8G8R8A8_UNORM_SRGB