Bagikan melalui


Arsitektur dan komponen

Catatan

Untuk aplikasi di Windows 10, sebaiknya gunakan WINDOWS.UI.Composition API alih-alih DirectComposition. Untuk informasi selengkapnya, lihat Memodernisasi aplikasi desktop Anda menggunakan lapisan Visual.

Topik ini menjelaskan komponen yang membentuk Microsoft DirectComposition. Ini terdiri dari bagian berikut.

Komponen perangkat lunak

DirectComposition terdiri dari komponen perangkat lunak utama berikut.

  • Pustaka aplikasi mode pengguna (dcomp.dll) yang mengimplementasikan API publik berbasis Model Objek Komponen (COM).
  • Mesin komposisi mode pengguna (dwmcore.dll) yang dihosting dalam proses Desktop Window Manager (DWM) (dwm.exe), dan melakukan komposisi desktop aktual.
  • Database objek mode kernel (bagian dari win32k.sys) yang melakukan marshal perintah dari aplikasi ke mesin komposisi.

Satu instans mesin komposisi menangani pohon komposisi DirectComposition untuk semua aplikasi dan pohon komposisi DWM, yang mewakili seluruh desktop. Baik database objek mode kernel maupun mesin komposisi mode pengguna dibuat sekali per sesi, sehingga mesin Terminal Server dengan beberapa pengguna memiliki beberapa instans dari kedua komponen tersebut.

Diagram berikut menunjukkan komponen DirectComposition utama dan bagaimana mereka berhubungan satu sama lain.

arsitektur tingkat atas directcomposition

Pustaka aplikasi

Pustaka aplikasi DirectComposition adalah API berbasis COM publik dengan satu titik masuk datar yang diekspor dari dcomp.dll dan mengembalikan penunjuk antarmuka ke objek perangkat. Objek perangkat, pada gilirannya, memiliki metode untuk membuat semua objek lain, yang masing-masing diwakili oleh penunjuk antarmuka. Semua antarmuka DirectComposition mewarisi dan mengimplementasikan sepenuhnya antarmuka IUnknown . Semua metode yang menerima antarmuka DirectComposition memeriksa apakah antarmuka diimplementasikan di dalam dcomp.dll atau apakah itu diimplementasikan oleh komponen lain. Karena DirectComposition tidak dapat diperluas, metode yang mengambil antarmuka sebagai parameter mengembalikan E_INVALIDARG jika antarmuka tidak diimplementasikan dalam dcomp.dll. API tidak memerlukan hak istimewa khusus; ini dapat dipanggil dengan proses yang berjalan pada tingkat akses terendah. Namun, karena API tidak beroperasi di sesi 0, API tidak cocok untuk layanan. Dalam hal ini, API DirectComposition mirip dengan API Microsoft DirectX lainnya, terutama Direct2D, Microsoft Direct3D, dan Microsoft DirectWrite.

Karena mesin komposisi dirancang khusus untuk eksekusi asinkron, properti objek di API DirectComposition hanya menulis. Semua properti memiliki metode setter, tetapi bukan metode getter. Membaca properti tidak hanya intensif sumber daya, tetapi juga dapat tidak akurat karena nilai apa pun yang dikembalikan mesin komposisi dapat segera menjadi tidak valid. Ini dapat terjadi jika, misalnya, animasi independen terikat ke properti yang sedang dibaca.

API aman untuk utas. Aplikasi dapat memanggil metode apa pun dari utas apa pun kapan saja. Namun, karena banyak metode API harus dipanggil dalam urutan tertentu, tanpa sinkronisasi apa pun, aplikasi dapat mengalami perilaku yang tidak dapat diprediksi tergantung pada bagaimana alur saling terkait. Misalnya, jika dua utas mengubah properti yang sama dari objek yang sama ke nilai yang berbeda secara bersamaan, aplikasi tidak dapat memprediksi nilai mana dari dua nilai yang akan menjadi nilai akhir properti. Demikian pula, jika dua utas memanggil Penerapan pada perangkat yang sama, utas tidak mendapatkan perilaku transaksional yang benar-benar karena panggilan ke Penerapan pada satu utas akan mengirimkan batch semua perintah yang dikeluarkan oleh kedua utas, bukan hanya yang disebut Commit.

Sistem mempertahankan semua status internal per objek perangkat. Jika aplikasi membuat dua atau beberapa objek perangkat DirectComposition, aplikasi dapat mempertahankan batch independen dan status lainnya di antara keduanya.

Semua objek DirectComposition memiliki afinitas objek perangkat; objek yang dibuat oleh objek perangkat tertentu hanya dapat digunakan dengan objek perangkat tersebut, dan hanya dapat dikaitkan dengan objek lain yang dibuat oleh objek perangkat yang sama. Dengan kata lain, setiap objek perangkat adalah pulau fungsionalitas terpisah. Satu pengecualian adalah kelas visual, yang memungkinkan pembuatan pohon visual di mana visual dapat dimiliki oleh objek perangkat yang berbeda dari induknya. Ini memungkinkan skenario di mana aplikasi dan kontrol dapat mengelola satu pohon komposisi tanpa perlu berbagi satu objek perangkat DirectComposition.

Mesin komposisi

Mesin komposisi DirectComposition berjalan pada proses khusus, terpisah dari proses aplikasi apa pun. Satu proses komposisi, dwm.exe, mendukung setiap aplikasi dalam sesi. Setiap aplikasi dapat membuat dua pohon visual untuk setiap jendela yang dimilikinya. Semua pohon sebenarnya diimplementasikan sebagai subtrees dari pohon visual yang lebih besar yang juga mencakup struktur komposisi DWM. DWM membangun satu pohon visual besar untuk setiap desktop dalam sesi. Berikut adalah keuntungan utama dari arsitektur ini:

  • Mesin komposisi memiliki akses ke semua bitmap aplikasi dan pohon visual, yang memungkinkan interoperabilitas dan komposisi jendela lintas proses.
  • Mesin komposisi berjalan dalam proses sistem tepercaya yang terpisah dari proses aplikasi apa pun, memungkinkan aplikasi yang memiliki hak akses rendah untuk menyusun konten yang dilindungi dengan aman.
  • Mesin komposisi dapat mendeteksi kapan jendela tertentu sepenuhnya terisi dan menghindari pemborosan sumber daya CPU dan unit pemrosesan grafis (GPU) yang menyusun jendela.
  • Mesin komposisi dapat menyusun langsung ke buffer belakang layar, menghindari kebutuhan akan salinan tambahan yang diperlukan untuk mesin komposisi per proses.
  • Semua aplikasi berbagi satu perangkat Direct3D untuk komposisi, yang menawarkan penghematan memori yang cukup besar

Pohon visual adalah struktur yang dipertahankan. API DirectComposition memaparkan metode untuk mengedit struktur dalam batch perubahan yang diproses secara atomik. Objek akar dalam API DirectComposition adalah objek perangkat, yang berfungsi sebagai pabrik untuk semua objek DirectComposition lainnya dan berisi metode yang disebut Commit. Mesin komposisi tidak mencerminkan perubahan apa pun yang dilakukan aplikasi pada pohon visual sampai aplikasi memanggil Commit, di mana semua perubahan sejak Commit terakhir diproses sebagai satu transaksi.

Persyaratan untuk memanggil Commit mirip dengan konsep "bingkai" kecuali itu, karena mesin komposisi berjalan secara asinkron, ia dapat menyajikan beberapa bingkai yang berbeda antara panggilan ke Commit. Dalam DirectComposition, bingkai adalah perulangan tunggal dari mesin komposisi, dan interval yang dihabiskan oleh aplikasi antara dua panggilan ke Commit disebut batch.

DirectComposition membuat batch semua panggilan aplikasi ke API DirectComposition. Database objek kernel, yang diimplementasikan dalam driver sesi win32k.sys, menyimpan semua informasi status yang terkait dengan panggilan API.

Mesin komposisi menghasilkan satu bingkai untuk setiap vertikal kosong di layar. Bingkai dimulai pada kosong vertikal dan menargetkan kosong vertikal berikutnya. Ketika bingkai dimulai, mesin komposisi mengambil semua batch yang tertunda dan menyertakan perintahnya dalam bingkai itu. Batch ditempatkan dalam antrean tertunda ketika aplikasi memanggil Commit, dan antrean yang tertunda dibersihkan secara atomik di awal bingkai. Oleh karena itu, ada satu titik waktu yang menandai awal bingkai. Setiap batch yang dikirimkan sebelum titik ini disertakan dalam bingkai, sementara batch apa pun yang dikirimkan setelah harus menunggu hingga bingkai berikutnya diproses. Perulangan komposisi lengkap adalah sebagai berikut:

  1. Perkirakan waktu kosong vertikal berikutnya.
  2. Ambil semua batch yang tertunda.
  3. Proses batch yang diambil.
  4. Perbarui semua animasi menggunakan waktu yang diperkirakan di langkah 1.
  5. Tentukan wilayah layar yang perlu dikomposisi ulang.
  6. Buat ulang wilayah kotor.
  7. Sajikan bingkai dengan membalik buffer belakang dan depan untuk setiap layar.
  8. Jika tidak ada yang dibuat dan disajikan dalam langkah 6 dan 7, tunggu hingga batch diterapkan.
  9. Tunggu hingga vertikal berikutnya kosong.

Jika ada beberapa monitor yang melekat pada adaptor video tunggal, mesin komposisi menggunakan kosong vertikal monitor utama untuk mendorong perulangan komposisi dan mengatur waktu pengambilan sampel animasi. Setiap monitor diwakili oleh rantai balik layar penuh yang terpisah; mesin komposisi mengulangi langkah 6 dan 7 untuk setiap monitor, dengan cara round-robin, menggunakan satu perangkat Direct3D. Jika ada juga beberapa adaptor video, mesin komposisi menggunakan perangkat Direct3D terpisah untuk setiap adaptor video dalam langkah 6 dan 7.

Bingkai komposisi dijadwalkan untuk selalu dimulai pada kosong vertikal, seperti yang ditunjukkan oleh ilustrasi berikut.

penjadwalan bingkai komposisi

Jika mesin komposisi tidak memiliki pekerjaan yang harus dilakukan karena pohon komposisi tidak berubah, benang komposisi tidur sambil menunggu batch baru. Ketika batch baru dikirimkan, utas komposisi bangun tetapi segera kembali tidur sampai vertikal berikutnya kosong. Perilaku ini memastikan waktu mulai dan akhir bingkai yang dapat diprediksi untuk aplikasi dan untuk mesin komposisi.

Mesin komposisi menerbitkan waktu presentasi bingkai dan kecepatan bingkai saat ini. Menerbitkan informasi ini memungkinkan aplikasi untuk memperkirakan waktu presentasi untuk batch mereka sendiri, yang pada gilirannya memungkinkan animasi disinkronkan. Secara khusus, aplikasi dapat menggunakan kombinasi statistik bingkai dari mesin komposisi, dan model historis berapa lama utas UI-nya menghasilkan batch, untuk menentukan waktu pengambilan sampel untuk animasinya sendiri.

Misalnya, di awal batch aplikasi yang ditunjukkan dalam ilustrasi sebelumnya, aplikasi dapat meminta mesin komposisi untuk menentukan waktu presentasi yang tepat dari bingkai berikutnya. Aplikasi kemudian dapat menggunakan waktu saat ini, bersama dengan informasi tentang batch sebelumnya yang telah dihasilkannya, untuk menentukan apakah aplikasi dapat menyelesaikan batch saat ini sebelum vertikal berikutnya kosong. Oleh karena itu, aplikasi menggunakan waktu presentasi bingkai sebagai waktu pengambilan sampel untuk animasinya sendiri. Jika aplikasi menentukan bahwa tidak mungkin untuk menyelesaikan pekerjaannya dalam kosong vertikal saat ini, aplikasi dapat menggunakan waktu bingkai berikutnya sebagai waktu pengambilan sampel sebagai gantinya, menggunakan informasi kecepatan bingkai yang dikembalikan oleh mesin komposisi untuk menghitung waktu tersebut.

Konsep DirectComposition