Untuk performa terbaik, gunakan model flip DXGI
Topik ini memberikan panduan pengembang tentang cara memaksimalkan performa dan efisiensi dalam tumpukan presentasi pada versi Windows modern. Ini mengambil di mana model flip DXGI, DirectX 12: Mode Presentasi Dalam Windows 10 (video), dan Peningkatan Presentasi di Windows 10: Tampilan Awal (video) ditinggalkan.
Ajakan bertindak
Jika Anda masih menggunakan DXGI_SWAP_EFFECT_DISCARD atau DXGI_SWAP_EFFECT_SEQUENTIAL (alias "blt" model sekarang), saatnya untuk berhenti!
Beralih ke DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL atau DXGI_SWAP_EFFECT_FLIP_DISCARD (alias model balik) akan memberikan performa yang lebih baik, penggunaan daya yang lebih rendah, dan menyediakan serangkaian fitur yang lebih kaya. (Lihat enumerasi DXGI_SWAP_EFFECT untuk informasi selengkapnya tentang nilai-nilai ini.)
Model flip yang disajikan sejauh membuat mode berjendela secara efektif setara atau lebih baik jika dibandingkan dengan mode klasik "eksklusif layar penuh". Bahkan, Anda mungkin ingin mempertimbangkan kembali apakah aplikasi Anda benar-benar membutuhkan mode eksklusif layar penuh, karena manfaat dari jendela tanpa batas model balik mencakup peralihan Alt-Tab yang lebih cepat dan integrasi yang lebih baik dengan fitur tampilan modern.
Mengapa sekarang? Sebelum Pembaruan April 2018, model blt yang disajikan dapat mengakibatkan robek terlihat ketika digunakan pada konfigurasi GPU hibrid, sering ditemukan di laptop kelas atas (lihat KB 3158621). Dalam Pembaruan April 2018, robekan ini telah diperbaiki, dengan biaya beberapa pekerjaan tambahan. Jika Anda melakukan presentasi blt pada framerate tinggi di seluruh GPU hibrid, terutama pada resolusi tinggi seperti 4K, pekerjaan tambahan ini dapat memengaruhi performa keseluruhan. Untuk mempertahankan performa terbaik pada sistem ini, beralih dari blt ke model yang ada. Selain itu, pertimbangkan untuk mengurangi resolusi swapchain Anda, terutama jika bukan titik utama interaksi pengguna (seperti yang sering terjadi dengan jendela pratinjau VR).
Riwayat singkat
Apa itu model balik? Apa alternatifnya?
Sebelum Windows 7, satu-satunya cara untuk menyajikan konten dari D3D adalah dengan "blt" atau menyalinnya ke permukaan yang dimiliki oleh jendela atau layar. Dimulai dengan efek pertukaran FLIPEX D3D9, dan datang ke DXGI melalui efek pertukaran FLIP_SEQUENTIAL di Windows 8, kami telah mengembangkan cara yang lebih efisien untuk menempatkan konten di layar dengan membagikannya langsung dengan komposit desktop, dengan salinan minimal. Lihat model flip DXGI untuk gambaran umum teknologi tingkat tinggi.
Pengoptimalan ini dimungkinkan berkat DWM (Desktop Window Manager), yang merupakan komposittor yang mendorong desktop Windows.
Kapan saya harus menggunakan model blt?
Ada satu bagian fungsionalitas yang tidak disediakan model flip: kemampuan untuk memiliki beberapa API yang berbeda yang menghasilkan konten, yang semuanya melapisi ke dalam HWND yang sama, saat ini. Contohnya adalah menggunakan D3D untuk menggambar latar belakang jendela, lalu Windows GDI untuk menggambar sesuatu di atas, atau menggunakan dua API grafis yang berbeda, atau dua swapchain dari API yang sama, untuk menghasilkan bingkai alternatif. Jika Anda tidak memerlukan interop tingkat HWND di antara komponen grafis, Maka Anda tidak memerlukan model blt.
Ada bagian kedua dari fungsionalitas yang tidak disediakan dalam desain model balik asli, tetapi tersedia sekarang, yang merupakan kemampuan untuk hadir pada framerate yang tidak terhambat. Untuk aplikasi yang menggunakan interval sinkronisasi 0, kami tidak menyarankan untuk beralih ke model balik kecuali IDXGIFactory5::CheckFeatureSupport API tersedia, dan melaporkan dukungan untuk DXGI_FEATURE_PRESENT_ALLOW_TEARING. Fitur ini hampir di mana-mana pada versi terbaru Windows 10 dan pada perangkat keras modern.
DirectFlip
Jika Anda telah menonton DirectX 12: Mode Presentasi Dalam Windows 10, Anda akan melihat pembicaraan tentang "Balik Langsung" dan "Balik Independen." Ini adalah pengoptimalan yang diaktifkan untuk aplikasi menggunakan swapchain model flip. Tergantung pada konfigurasi jendela dan buffer, dimungkinkan untuk melewati komposisi desktop sepenuhnya dan langsung mengirim bingkai aplikasi ke layar, dengan cara yang sama seperti layar penuh eksklusif.
Hari-hari ini, pengoptimalan ini dapat terlibat dalam salah satu dari 3 skenario, dalam rangka meningkatkan fungsionalitas:
- DirectFlip: Buffer swapchain Anda cocok dengan dimensi layar, dan wilayah klien jendela Anda mencakup layar. Alih-alih menggunakan swapchain DWM untuk ditampilkan di layar, swapchain aplikasi digunakan.
- DirectFlip dengan fitter panel: Wilayah klien jendela Anda mencakup layar, dan buffer swapchain Anda berada dalam beberapa faktor penskalaan yang bergantung pada perangkat keras (misalnya, 0,25x hingga 4x) layar. Perangkat keras pemindaian GPU digunakan untuk menskalakan buffer Anda saat mengirimkannya ke layar.
- DirectFlip dengan overlay multi-pesawat (MPO): Buffer swapchain Anda berada dalam beberapa faktor penskalaan yang bergantung pada perangkat keras dari dimensi jendela Anda. DWM dapat memesan bidang pemindaian perangkat keras khusus untuk aplikasi Anda, yang kemudian dipindai dan berpotensi direntangkan ke sub-wilayah layar yang dicampur alfa.
Dengan model flip berjendela, aplikasi dapat meminta dukungan perangkat keras untuk skenario DirectFlip yang berbeda dan menerapkan berbagai jenis penskalaan dinamis melalui penggunaan IDXGIOutput6::CheckHardwareCompositionSupport. Salah satu peringatan yang perlu diingat adalah bahwa jika fitter panel digunakan, kursor mungkin menderita efek samping peregangan, yang ditunjukkan melalui DXGI_HARDWARE_COMPOSITION_SUPPORT_FLAG_CURSOR_STRETCHED.
Setelah swapchain Anda "DirectFlipped," maka DWM dapat tidur, dan hanya bangun ketika sesuatu berubah di luar aplikasi Anda. Bingkai aplikasi Anda dikirim langsung ke layar, secara independen, dengan efisiensi yang sama dengan layar penuh eksklusif. Ini adalah "Flip Independen," dan dapat terlibat dalam semua skenario di atas. Jika konten desktop lain berada di atas, DWM dapat beralih kembali dengan mulus ke mode yang disusun, secara efisien "menyusun ulang" konten di atas aplikasi sebelum membaliknya, atau memanfaatkan MPO untuk mempertahankan mode balik independen.
Lihat alat PresentMon untuk mendapatkan wawasan tentang mana dari hal di atas yang digunakan.
Apa lagi yang baru dalam model flip?
Selain peningkatan di atas, yang berlaku untuk swapchain standar tanpa sesuatu yang istimewa, ada beberapa fitur yang tersedia untuk aplikasi model balik untuk digunakan:
- Mengurangi latensi menggunakan DXGI_SWAP_CHAIN_FLAG_FRAME_LATENCY_WAITABLE_OBJECT. Ketika dalam mode Balik Independen, Anda bisa turun ke 1 bingkai latensi pada versi Windows terbaru, dengan fallback yang anggun sesemua mungkin saat disusun.
- Peringatan: ada masalah yang memberikan minimal dua bingkai latensi dalam Windows 10 Anniversary Update dan sebelumnya. Lihat topik forum ini untuk informasi selengkapnya. Ini diperbaiki dalam Pembaruan Fall Creator.
- DXGI_SWAP_EFFECT_FLIP_DISCARD memungkinkan mode "komposisi terbalik" dari flip langsung, yang menghasilkan pekerjaan yang kurang keseluruhan untuk menampilkan desktop. DWM dapat menulis pada buffer aplikasi dan mengirimnya ke layar, alih-alih melakukan salinan lengkap ke dalam swapchain mereka sendiri.
- DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING dapat mengaktifkan latensi yang lebih rendah daripada objek yang dapat di tunggu, bahkan di jendela pada sistem dengan dukungan overlay multi-bidang.
- Aplikasi memiliki kontrol atas penskalaan konten yang terjadi selama pengubahan ukuran jendela, menggunakan properti DXGI_SCALING yang diatur selama pembuatan swapchain.
- Konten dalam format HDR (R10G10B10A2_UNORM atau R16G16B16A16_FLOAT) tidak dijepit kecuali disusam ke desktop SDR.
- Statistik saat ini tersedia dalam mode berjendela.
- Ada kompatibilitas yang lebih besar dengan model aplikasi UWP (Platform Windows Universal) dan DX12 karena ini hanya kompatibel dengan model flip.
Apa yang harus saya lakukan untuk menggunakan model flip?
Pertukaran model balik memiliki beberapa persyaratan tambahan di atas blt swapchains:
- Jumlah buffer harus setidaknya 2.
- Setelah Panggilan saat ini , buffer belakang perlu secara eksplisit terikat kembali ke konteks segera D3D11 sebelum dapat digunakan lagi.
- Setelah memanggil SetFullscreenState, aplikasi harus memanggil ResizeBuffers sebelum Ada.
- Swapchain MSAA (multisample anti-aliasing) tidak didukung secara langsung dalam model flip, sehingga aplikasi perlu melakukan penyelesaian MSAA sebelum mengeluarkan Present.
Cara memilih resolusi penyajian dan presentasi yang tepat
Pola tradisional untuk aplikasi di masa lalu adalah memberi pengguna daftar resolusi untuk dipilih ketika pengguna memilih mode layar penuh eksklusif. Dengan kemampuan tampilan modern untuk memulai penskalaan konten dengan mulus, pertimbangkan untuk memberi pengguna kemampuan untuk memilih resolusi penyajian untuk penskalaan performa, independen dari resolusi output, dan bahkan dalam mode berjendela. Selain itu, aplikasi harus memanfaatkan IDXGIOutput6::CheckHardwareCompositionSupport untuk menentukan apakah mereka perlu menskalakan konten sebelum menyajikannya, atau apakah mereka harus membiarkan perangkat keras melakukan penskalaan untuk mereka.
Konten Anda mungkin perlu dimigrasikan dari satu GPU ke GPU lainnya sebagai bagian dari operasi saat ini atau komposisi. Ini sering terjadi pada laptop multi-GPU, atau sistem dengan GPU eksternal yang dicolokkan. Karena konfigurasi ini menjadi lebih umum, dan karena tampilan resolusi tinggi menjadi lebih umum, biaya menyajikan swapchain resolusi penuh meningkat. Jika target swapchain Anda bukan titik utama interaksi pengguna, seperti yang sering terjadi dengan judul VR yang menyajikan pratinjau 2D adegan VR ke jendela sekunder, pertimbangkan untuk menggunakan swapchain resolusi yang lebih rendah untuk meminimalkan jumlah bandwidth yang perlu ditransfer di berbagai GPU.
Pertimbangan lainnya
Pertama kali Anda meminta GPU untuk menulis ke buffer swapchain back adalah saat GPU akan menunggu buffer tersedia. Jika memungkinkan, tunda titik ini sejauh mungkin ke dalam bingkai.