Bagikan melalui


Permukaan komposisi

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 jenis permukaan yang didukung Microsoft DirectComposition.

Permukaan logis DirectComposition

DirectComposition mengekspos objek IDCompositionSurface untuk mewakili permukaan komposisi logis. DirectComposition mengekspos API yang dapat Anda gunakan untuk membuat, memperbarui, dan menghapus permukaan logis ini. Setiap permukaan dapat dikaitkan dengan satu atau beberapa visual. Aplikasi bertanggung jawab untuk mengelola masa pakai permukaan logis.

Memperbarui permukaan logis

Aplikasi dapat memperbarui permukaan logis dengan memanggil BeginDraw dan menentukan ukuran dan offset persegi panjang pada permukaan logis yang ingin diperbarui aplikasi. DirectComposition mengalokasikan persegi panjang dengan ukuran yang ditentukan, lalu mengembalikan permukaan dan offset yang sesuai yang perlu digambar atau diperbarui oleh aplikasi. Batas persegi panjang pembaruan terikat oleh ukuran permukaan. Misalnya, persegi panjang pembaruan untuk permukaan 40 demi 100 piksel dapat mencapai (0.0.40.100). Selain itu, wilayah yang dapat diperbarui diberlakukan oleh persegi panjang penjaga. Karena hanya ada satu persegi panjang penjaga pada satu waktu, hanya satu permukaan logis yang dapat diperbarui pada satu waktu. BeginDraw mengembalikan kode kesalahan jika EndDraw atau SuspendDraw belum dipanggil setelah panggilan sebelumnya ke BeginDraw. Aplikasi dapat menambahkan panggilan berkomitmen ke BeginDraw ke batch, tetapi tidak berlaku sampai EndDraw dipanggil dan diterapkan.

Menangguhkan pembaruan ke permukaan logis

Aplikasi yang perlu memperbarui permukaan yang berbeda dapat memanggil SuspendDraw pada pembaruan saat ini, lalu memanggil BeginDraw untuk memulai pembaruan baru. Microsoft DirectComposition memungkinkan beberapa pembaruan, tetapi hanya satu yang dapat aktif pada satu waktu. Ini berarti Bahwa Anda perlu memanggil SuspendDraw atau EndDraw di satu permukaan sebelum memanggil BeginDraw pada yang berikutnya. Tidak seperti EndDraw, batch yang diterapkan dapat berisi permukaan yang dalam status SuspendDraw , tetapi pembaruan tersebut tidak akan ditampilkan di layar sampai EndDraw dipanggil.

Melanjutkan pembaruan ke permukaan logis

Aplikasi dapat melanjutkan pembaruan ke permukaan yang berada dalam status SuspendDraw dengan memanggil ResumeDraw. Metode ini hanya dapat dipanggil pada permukaan yang ditangguhkan.

Mengakhiri pembaruan ke permukaan logis

Memanggil EndDraw dan Commit adalah satu-satunya cara untuk melihat perubahan pembaruan bitmap di layar. Setiap panggilan ke EndDraw harus memiliki panggilan yang sesuai ke BeginDraw untuk menghapus persegi panjang penjaga. Permukaan logis mempertahankan semua pembaruan hingga Penerapan dipanggil. Anda juga dapat memanggil EndDraw pada permukaan yang berada dalam status SuspendDraw karena EndDraw adalah resume/end tersirat. Setelah Anda memanggil EndDraw, konten yang diperbarui disajikan ke layar dan dibuang sehingga memori untuk pembaruan dapat digunakan kembali untuk pembaruan nanti.

Contoh penggunaan permukaan logis

Contoh berikut menjelaskan langkah-langkah yang akan diambil aplikasi jika membuat pohon visual yang terdiri dari dua visual, lalu perlu memperbarui wilayah tertentu dari dua permukaan logis yang terkait dengan visual:

  1. Membuat perangkat DirectComposition.
  2. Buat pohon visual yang terdiri dari simpul akar dan visual 1 dan 2.
  3. Buat permukaan logis 1 dan 2.
  4. Panggil SetContent untuk mengaitkan permukaan logis dengan visual 1 dan 2.
  5. Panggil BeginDraw pada sub-persegi panjang permukaan logis 1.
  6. Perbarui permukaan pada offset yang dikembalikan oleh DirectComposition.
  7. Langkah-langkah opsional:
    1. Panggil SuspendDraw pada permukaan logis 1.
    2. Panggil BeginDraw pada sub-rect permukaan logis 2.
    3. Perbarui permukaan pada offset yang dikembalikan oleh DirectComposition.
    4. Panggil EndDraw pada permukaan logis 2.
    5. Panggil ResumeDraw pada permukaan logis 1.
  8. Perbarui permukaan pada offset yang dikembalikan oleh DirectComposition.
  9. Panggil EndDraw pada permukaan logis 1.
  10. Panggil Commit.

Permukaan virtual DirectComposition

DirectComposition mengekspos antarmuka IDCompositionVirtualSurface untuk mewakili permukaan virtual, yang merupakan kumpulan permukaan logis (petak peta) yang disusun dalam kisi tetap dengan petak peta dengan ukuran tetap. Aplikasi menentukan ukuran tekstur virtual pada waktu pembuatan. Ukurannya menetapkan batasan untuk permukaan virtual. Permukaan dapat dikaitkan dengan satu atau beberapa visual.

Ketika permukaan virtual diinisialisasi, permukaan tidak didukung oleh alokasi aktual. Dengan kata lain, itu tidak menahan bit apa pun. DirectComposition mengalokasikan petak peta (yaitu, objek permukaan komposisi) setelah aplikasi mulai memperbarui permukaan. Aplikasi memperbarui permukaan virtual dengan memanggil BeginDraw dan menentukan wilayah yang menarik sehubungan dengan koordinat permukaan virtual. Kemudian, DirectComposition mengalokasikan petak peta yang diperlukan untuk menahan pembaruan, dan mengembalikan permukaan komposisi dan offset untuk diperbarui.

Seperti halnya permukaan logis, Anda dapat memanggil BeginDraw, SuspendDraw, ResumeDraw , dan EndDraw di permukaan virtual. Selain itu, DirectComposition mengekspos metode yang dapat Anda gunakan untuk mengubah ukuran dan memangkas permukaan virtual yang ada.

Mengubah ukuran permukaan virtual

Metode Ubah Ukuran mengubah batas permukaan virtual, yang berarti bahwa pembaruan atau alokasi baru harus jatuh dalam batas yang ditetapkan oleh ukuran baru. Aplikasi menggunakan Resize untuk memberi tahu DirectComposition bahwa wilayah tertentu dari permukaan virtual tidak lagi diperlukan dan dapat diklaim kembali. Jika Mengubah ukuran menyusutkan permukaan virtual, aplikasi tidak dapat lagi memperbarui wilayah di luar batas baru.

Ilustrasi berikut menunjukkan permukaan virtual 3 kali 3 diubah ukurannya menjadi 2 per 2. Wilayah merah mewakili petak peta yang dibuang sebagai bagian dari operasi mengubah ukuran, dan memori diklaim kembali oleh DirectComposition. Setelah mengubah ukuran, aplikasi tidak dapat membuat pembaruan ke wilayah merah tanpa mengubah ukuran permukaan virtual lagi.

mengubah ukuran permukaan virtual

Operasi pengurangan ukuran segera berlaku. DirectComposition tidak menunggu aplikasi memanggil Commit untuk membuat pembaruan perubahan ukuran. Misalnya, aplikasi membuat urutan panggilan berikut.

pVirtualSurface->Resize(0, 0);
pVirtualSurface->Resize(INT_MAX, INT_MAX);
pDevice->Commit();

Dalam contoh ini, aplikasi kehilangan semua konten pada perubahan ukuran pertama. Pengubahan ukuran kedua tidak berpengaruh meskipun dipanggil sebelum Penerapan. Dalam hal ini tidak ada yang muncul di layar.

Memangkas permukaan virtual

Metode Pangkas mengidentifikasi wilayah permukaan virtual yang dibutuhkan aplikasi. Ini tidak mengubah ukuran batas permukaan virtual, tetapi memberi tahu DirectComposition permukaan logis mana yang saat ini perlu dialokasikan.

Dalam ilustrasi berikut, kotak hijau adalah viewport aplikasi. Aplikasi awalnya merender ke enam petak peta pertama (biru) dari permukaan virtual (abu-abu muda) yang ada di viewport. Saat halaman yang diwakili oleh permukaan virtual menggulir, aplikasi perlu merender enam petak peta terakhir. Aplikasi memanggil Pangkas untuk menunjukkan bahwa wilayah yang ditentukan oleh enam petak peta terakhir adalah tempat konten berada, dan sisanya tidak diperlukan saat ini. DirectComposition kemudian dapat memilih untuk mendaur ulang permukaan logis yang awalnya mewakili enam petak peta pertama (abu-abu gelap).

memangkas permukaan virtual

Konsep DirectComposition