Apakah buffering ganda diperlukan saat Komposisi Desktop diaktifkan?

Apakah buffering ganda masih diperlukan saat Komposisi Desktop diaktifkan?

Dalam Panduan Kompatibilitas Aplikasi Microsoft:

Antarmuka Perangkat Grafis (GDI)

Sebelum Windows Vista dan Windows Server 2008, pegangan jendela (HWND) dilukis langsung ke layar, yang memiliki manfaat tertentu, namun membatasi cara Windows dapat menampilkan dan mengelola jendela tingkat atas. Di Windows Vista dan Windows Server 2008, semua jendela tingkat atas dirender ke bitmap di luar layar (mirip dengan WS_EX_LAYERED), dan Desktop Window Manager menggabungkan gambar-gambar tersebut untuk menggambar desktop.

Sepertinya semua rendering sekarang dilakukan ke bitmap di luar layar:

jendela dirender ke bitmap di luar layar

Apakah ini benar?

Alasan saya bertanya adalah karena saya masih melihat kedipan selama siklus pengecatan standar:

  • WM_ERASEBKGND
  • WM_CAT

saat komposisi desktop diaktifkan:

teks alternatif

saya akan berasumsi bahwa di antara panggilan ke

   BeginPaint(hWnd, paintStructure);
   ...
   EndPaint(hWnd, paintStructure);

bahwa semua pengecatan akan terjadi pada buffer belakang:

jendela dirender ke bitmap di luar layar

Sementara itu, buffer depan tidak akan terpengaruh.


person Ian Boyd    schedule 03.12.2009    source sumber


Jawaban (3)


Apakah ini benar?

Yup (begitulah cara thumbnail menunjukkan bagian jendela yang saat ini dikaburkan).

Rendering layar DWM memiliki buffer ganda. Namun, jika ia mengambil buffer antara menghapus dan mengecat... itu akan muncul sebagai artefak yang terlihat. Jadi, Anda masih perlu menggandakan buffer. Buffer ganda terjadi pada desktop (yaitu menggambar tampilan desktop berikutnya sepenuhnya dan kemudian membalik), bukan pada buffer di luar layar yang digunakan untuk setiap jendela.

person DrPizza    schedule 03.12.2009
comment
Anda berdua menunjukkan hal yang sama: yang mungkin menjadikannya jawaban yang benar. saya melukis langsung ke buffer yang digunakan untuk melukis. Jika DWM mengambil buffer itu saat saya melukis setengah, saya akan melihat konten setengah dicat. - person Ian Boyd; 04.12.2009

Ya, melukis ke bitmap di luar layar hanya memungkinkan DWM untuk menggabungkan jendela sesuai keinginannya tanpa harus menunggu aplikasi digambar ulang (seperti halnya di XP ketika Anda memindahkan jendela ke jendela lain, misalnya).

Hal ini tidak berarti bahwa menggambar pada permukaan di luar layar secara otomatis mengurangi kedipan. Jika Anda menghapus jendela lalu menggambar ulang dan di antara kedua tindakan tersebut DWM menggambar ulang layar (yang dilakukannya sekitar 60 kali per detik), tentu saja Anda akan melihat kedipan.

Itu memecahkan masalah "jendela putih" ketika aplikasi tidak menggambar ulang dengan cukup cepat dan juga mengurangi menggambar ulang karena jendela yang tumpang tindih. Tapi itu tidak membantu melawan kedipan. DWM tidak memiliki cara untuk mengetahui bahwa operasi pengecatan Anda belum selesai dan Anda ingin gambar jendela yang lama ditampilkan sampai Anda menggambar isinya lagi.

person Joey    schedule 03.12.2009
comment
Mengingat bahwa pengecatan di windows dikelompokkan dengan baik antara panggilan ke BeginPaint, dan EndPaint, Anda akan berpikir bahwa DWM dapat mengetahui kapan waktu yang aman untuk mengambil pembaruan. - person Chris Becke; 09.02.2010
comment
Hal ini harus terus dipantau. Saya menduga, pertimbangan kinerja ditempatkan di atas konten yang mungkin setengah-setengah. - person Joey; 09.02.2010
comment
@Chris: Tidak ada persyaratan bagi aplikasi untuk menelepon BeginPaint dan EndPaint. Anda menjelaskan, bagaimana suatu sistem dapat diimplementasikan di dunia yang sempurna. Dunia ini tidak. - person IInspectable; 15.05.2015
comment
Segalanya menjadi menyimpang jika Anda TIDAK memanggil BeginPaint/EndPaint sebagai respons terhadap WM_PAINT. - person Chris Becke; 15.05.2015
comment
@ Chris: Tidak, mereka tidak melakukannya. Selama Anda memastikan untuk memvalidasi wilayah kotor, melalui panggilan ke ValidateRect. - person IInspectable; 15.05.2015

Ini telah berubah di Windows 10 (setidaknya tahun 1903).

Saat DWM diaktifkan, semuanya sekarang memiliki buffer ganda dengan benar secara default. Tidak ada kedipan saat pengecatan ulang/pengubahan ukuran, bahkan saat memindahkan dan mengubah ukuran kontrol dengan cara yang paling dasar.

DWM sekarang tampaknya hanya menampilkan bitmap baru setelah pengecatan selesai, dan bukan sebelumnya.

person Leo Davidson    schedule 25.10.2019
comment
Bagaimana DWM mengetahui bahwa suatu lukisan telah selesai? Saya penasaran. Saya membayangkan itu harus menjadi sesuatu yang EndPaint akan lakukan -- meskipun aplikasi yang tidak menggunakan EndPaint (yang jumlahnya sangat banyak, baik atau buruk) akan dirusak oleh DWM. Atau mungkin, DWM mengetahui beberapa pengecatan telah selesai ketika panggilan prosedur jendela kembali setelah diteruskan WM_PAINT? Atau mungkin ketika ReleaseDC dipanggil (yang, sekali lagi, akan menghilangkan sejumlah aplikasi yang menyimpan DC-nya)? - person amn; 25.06.2021