Bagikan melalui


Model flip DXGI

Windows 8 menambahkan dukungan untuk membalik model presentasi dan statistik presentasi terkait di DXGI 1.2. model presentasi flip DXGI Windows 8 mirip dengan Presentasi Mode Flip Direct3D 9EX Windows 7. Aplikasi presentasi berbasis kecepatan video atau bingkai seperti game dapat menguntungkan sebagian besar dengan menggunakan model presentasi balik. Aplikasi yang menggunakan model presentasi flip DXGI mengurangi beban sumber daya sistem dan meningkatkan performa. Aplikasi juga dapat menggunakan peningkatan statistik saat ini dengan membalik model presentasi untuk mengontrol laju presentasi dengan lebih baik dengan memberikan umpan balik real-time dan mekanisme koreksi.

Membandingkan model flip DXGI dan model BitBlt

Runtime menggunakan transfer blok bit (bitblt) dan membalik model presentasi untuk menyajikan konten grafis pada monitor tampilan. Perbedaan terbesar antara model presentasi bitblt dan flip adalah bagaimana konten back-buffer sampai ke Windows 8 DWM untuk komposisi. Dalam model bitblt, konten buffer belakang disalin ke permukaan pengalihan pada setiap panggilan ke IDXGISwapChain1::P resent1. Dalam model balik, semua buffer belakang dibagikan dengan Desktop Window Manager (DWM). Oleh karena itu, DWM dapat menyusun langsung dari buffer belakang tanpa operasi salinan tambahan. Secara umum, model balik lebih efisien. Model flip juga menyediakan lebih banyak fitur, seperti statistik saat ini yang ditingkatkan.

Jika Anda memiliki komponen warisan yang menggunakan Windows Graphics Device Interface (GDI) untuk menulis ke HWND secara langsung, gunakan model bitblt.

Peningkatan performa model flip DXGI signifikan ketika aplikasi berada dalam mode berjendela. Urutan dalam tabel ini dan ilustrasi membandingkan penggunaan bandwidth memori dan membaca sistem dan menulis aplikasi berjendela yang memilih model balik versus model bitblt.

Langkah Model BitBlt hadir untuk DWM Model flip DXGI hadir untuk DWM
1. Aplikasi memperbarui bingkainya (Tulis)
Aplikasi memperbarui bingkainya (Tulis)
2. Runtime Direct3D menyalin konten permukaan ke permukaan pengalihan DWM (Baca, Tulis)
Runtime Direct3D meneruskan permukaan aplikasi ke DWM
3. Setelah salinan permukaan bersama selesai, DWM merender permukaan aplikasi ke layar (Baca, Tulis)
DWM merender permukaan aplikasi ke layar (Baca, Tulis)

 

ilustrasi perbandingan model blt dan model flip

Model balik mengurangi penggunaan memori sistem dengan mengurangi jumlah bacaan dan tulis oleh runtime Direct3D untuk komposisi bingkai berjendela oleh DWM.

Cara menggunakan model flip DXGI

Aplikasi Direct3D 11.1 yang menargetkan Windows 8 menggunakan model balik dengan membuat rantai pertukaran dengan nilai enumerasi DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL yang ditetapkan dalam anggota SwapEffect dari struktur DXGI_SWAP_CHAIN_DESC1. Saat Anda mengatur SwapEffect ke DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, atur juga anggota DXGI_SWAP_CHAIN_DESC1 ini ke nilai yang ditunjukkan:

  • BufferCount ke nilai antara 2 dan 16 untuk mencegah penalti performa sebagai akibat dari menunggu DWM untuk merilis buffer presentasi sebelumnya.
  • Format untuk DXGI_FORMAT_R16G16B16A16_FLOAT, DXGI_FORMAT_B8G8R8A8_UNORM, atau DXGI_FORMAT_R8G8B8A8_UNORM
  • Hitung anggota struktur DXGI_SAMPLE_DESC yang ditentukan anggota SampleDesc ke satu dan anggota KualitasDXGI_SAMPLE_DESC ke nol karena beberapa antialias sampel (MSAA) tidak didukung

Jika Anda menggunakan DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL pada Windows 7 atau sistem operasi yang lebih lama, pembuatan perangkat gagal. Saat menggunakan model balik, Anda dapat menggunakan statistik sajikan layar penuh dalam mode berjendela. Perilaku layar penuh tidak terpengaruh. Jika Anda meneruskan NULL ke parameter pFullscreenDescIDXGIFactory2::CreateSwapChainForHwnd untuk rantai swap berjendela dan mengatur SwapEffect ke DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL, runtime membuat satu buffer back tambahan dan memutar handel mana pun milik buffer yang menjadi buffer depan pada waktu presentasi.

Saat Anda menggunakan model balik, pertimbangkan tips berikut:

  • Gunakan satu rantai pertukaran model flip per HWND. Jangan menargetkan beberapa rantai pertukaran model balik ke HWND yang sama.
  • Jangan gunakan rantai pertukaran model flip dengan fungsi ScrollWindow atau ScrollWindowEx GDI. Beberapa aplikasi Direct3D menggunakan fungsi ScrollWindow dan ScrollWindowEx GDI untuk memperbarui konten jendela setelah peristiwa gulir pengguna terjadi. ScrollWindow dan ScrollWindowEx melakukan bitblts konten jendela di layar saat pengguna menggulir jendela. Fungsi-fungsi ini juga memerlukan pembaruan model bitblt untuk konten GDI dan Direct3D. Aplikasi yang menggunakan salah satu fungsi tidak akan selalu menampilkan konten jendela yang terlihat yang bergulir di layar saat aplikasi dalam mode berjendela. Kami menyarankan agar Anda tidak menggunakan fungsi ScrollWindow dan ScrollWindowEx GDI, dan sebaliknya menggambar ulang konten GDI dan Direct3D di layar sebagai respons terhadap pengguliran.
  • Gunakan model flip dalam HWND yang tidak juga ditargetkan oleh API lain, termasuk model presentasi bitblt DXGI, versi Direct3D lainnya, atau GDI. Karena model bitblt mempertahankan salinan tambahan permukaan, Anda dapat menambahkan GDI dan konten Direct3D lainnya ke HWND yang sama melalui pembaruan sebagian dari Direct3D dan GDI. Saat Anda menggunakan model balik, hanya konten Direct3D dalam rantai pertukaran model flip yang diteruskan runtime ke DWM yang terlihat. Runtime mengabaikan semua pembaruan konten Direct3D atau GDI model bitblt lainnya.

Sinkronisasi bingkai aplikasi model flip DXGI

Statistik saat ini adalah informasi pengaturan waktu bingkai yang digunakan aplikasi media untuk menyinkronkan aliran video dan audio dan memulihkan dari gangguan pemutaran video. Aplikasi dapat menggunakan informasi pengaturan waktu bingkai dalam statistik saat ini untuk menyesuaikan laju presentasi bingkai video mereka untuk presentasi yang lebih lancar. Untuk mendapatkan informasi statistik saat ini, hubungi metode IDXGISwapChain::GetFrameStatistics untuk mendapatkan struktur DXGI_FRAME_STATISTICS . DXGI_FRAME_STATISTICS berisi statistik tentang panggilan IDXGISwapChain1::P resent1 . Rantai pertukaran model flip menyediakan informasi statistik yang ada dalam mode berjendela dan layar penuh. Untuk rantai pertukaran model bitblt dalam mode berjendela, semua nilai DXGI_FRAME_STATISTICS adalah nol.

Untuk statistik model balik, IDXGISwapChain::GetFrameStatistics mengembalikan DXGI_ERROR_FRAME_STATISTICS_DISJOINT dalam situasi berikut:

  • Panggilan pertama ke GetFrameStatistics, yang menunjukkan awal urutan
  • Perubahan mode: baik mode berjendela ke atau dari layar penuh atau layar penuh ke transisi layar penuh

Nilai dalam anggota PresentRefreshCount, SyncRefreshCount, dan SyncQPCTimeDXGI_FRAME_STATISTICS memiliki karakteristik berikut:

  • PresentRefreshCount sama dengan SyncRefreshCount saat aplikasi hadir di setiap vsync.
  • SyncRefreshCount diperoleh pada interval vsync ketika saat ini dikirimkan, SyncQPCTime kira-kira waktu yang terkait dengan interval vsync.

Metode IDXGISwapChain::GetLastPresentCount mengembalikan jumlah terakhir saat ini, yaitu, ID saat ini dari panggilan IDXGISwapChain1::P resent1 terakhir yang dibuat oleh perangkat tampilan yang terkait dengan rantai pertukaran. ID saat ini adalah nilai anggota PresentCount dari struktur DXGI_FRAME_STATISTICS . Untuk rantai pertukaran model bitblt, sementara dalam mode berjendela, semua nilai DXGI_FRAME_STATISTICS adalah nol.

Menghindari, mendeteksi, dan memulihkan dari gangguan

Lakukan langkah-langkah ini untuk menghindari, mendeteksi, dan memulihkan dari gangguan dalam presentasi bingkai:

  1. Antrean IDXGISwapChain1::P resent1 panggilan (yaitu, panggil IDXGISwapChain1::P resent1 beberapa kali, yang menyebabkan mereka mengumpulkan dalam antrean).

  2. Buat struktur antrean saat ini untuk menyimpan semua IDXGISwapChain1::P resent1 yang ada yang berhasil dikirimkan (dikembalikan oleh IDXGISwapChain::GetLastPresentCount) dan nilai PresentRefreshCount terkait yang dihitung/diharapkan.

  3. Untuk mendeteksi kesalahan:

    • Hubungi IDXGISwapChain::GetFrameStatistics.
    • Untuk bingkai ini, dapatkan ID saat ini (PresentCount) dan jumlah vsync tempat sistem operasi menyajikan gambar terakhir ke monitor (PresentRefreshCount).
    • Ambil PresentRefreshCount yang diharapkan yang terkait dengan ID saat ini dan yang sebelumnya Anda simpan dalam struktur present-queue.
    • Jika PresentRefreshCount aktual lebih lambat dari PresentRefreshCount yang diharapkan, kesalahan telah terjadi.
  4. Untuk memulihkan dari kesalahan:

    • Hitung jumlah bingkai yang akan dilewati untuk pulih dari kesalahan. Misalnya, jika langkah 3 mengungkapkan bahwa jumlah vsync yang diharapkan (PresentRefreshCount) untuk ID saat ini (PresentCount) adalah 5 dan jumlah vsync aktual untuk ID saat ini adalah 8, jumlah bingkai yang akan dilewati untuk dipulihkan dari kesalahan adalah 3 bingkai.

    • Teruskan 0 ke parameter SyncInterval dalam jumlah panggilan ini ke IDXGISwapChain1::P resent1 untuk membuang dan melewati jumlah bingkai ini.

      Catatan

      Jika kesalahan terdiri dari sejumlah besar bingkai, panggil IDXGISwapChain1::P resent1 dengan parameter Bendera diatur ke DXGI_PRESENT_RESTART untuk membuang dan melewati semua hadiah antrean yang luar biasa.

       

Berikut adalah contoh skenario pemulihan dari gangguan dalam presentasi bingkai:

ilustrasi contoh skenario pemulihan dari gangguan dalam presentasi bingkai

Dalam skenario contoh, Anda mengharapkan bingkai A masuk ke layar pada jumlah vsync 1. Tetapi Anda benar-benar mendeteksi jumlah vsync yang bingkai A muncul di layar sebagai 4. Oleh karena itu, Anda menentukan bahwa terjadi kesalahan. Anda kemudian dapat membuang 3 bingkai, yaitu, Anda dapat meneruskan 0 ke parameter SyncInterval dalam 3 panggilan ke IDXGISwapChain1::P resent1. Dalam skenario contoh sebelumnya, untuk memulihkan dari kesalahan, Anda memerlukan total 8 panggilan IDXGISwapChain1::P resent1 . Bingkai ke-9 kemudian terlihat sesuai jumlah vsync yang Anda harapkan.

Berikut adalah garis waktu acara presentasi. Setiap garis vertikal mewakili vsync. Arah horizontal adalah waktu, yang meningkat ke kanan. Anda dapat menggunakan gambar untuk membayangkan bagaimana gangguan dapat terjadi.

ilustrasi garis waktu acara presentasi

Gambar menggambarkan urutan ini:

  1. Aplikasi ini bangun di vsync, merender biru, memanggil IDXGISwapChain1::P resent1, lalu kembali tidur.

  2. Unit pemrosesan grafis (GPU) bangun dari diam, melakukan render menjadi biru, lalu kembali tidur.

  3. DWM bangun pada vsync berikutnya, menyusun biru ke dalam buffer belakangnya, memanggil IDXGISwapChain1::P resent1, dan kemudian kembali tidur.

  4. Aplikasi ini bangun, merender warna hijau, memanggil IDXGISwapChain1::P resent1, lalu kembali tidur.

    Catatan

    Aplikasi secara bersamaan dijalankan saat GPU melakukan penyusunan warna biru.

     

  5. Selanjutnya, GPU merender hijau untuk aplikasi.

  6. Akhirnya, konverter digital ke analog (DAC) menunjukkan hasil komposisi DWM pada monitor pada vsync berikutnya.

Dari garis waktu, Anda dapat membayangkan latensi statistik saat ini dan bagaimana gangguan dapat terjadi. Misalnya, untuk menampilkan kesalahan DWM untuk warna hijau yang muncul di layar, bayangkan melebarkan kotak hijau/merah sehingga sisi kanan kotak hijau/merah cocok dengan sisi kanan kotak ungu/merah. Dalam skenario ini, DAC menunjukkan dua bingkai biru dan kemudian bingkai hijau. Anda dapat melihat bahwa kesalahan ini terjadi dari membaca statistik saat ini.

Meningkatkan presentasi dengan model balik, persegi panjang kotor, dan area yang digulir