Bagikan melalui


Membandingkan Akselerasi Perangkat Keras Direct2D dan GDI

Direct2D dan GDI adalah API penyajian 2D mode langsung dan keduanya menawarkan beberapa tingkat akselerasi perangkat keras. Topik ini mengeksplorasi perbedaan antara Direct2D dan GDI, termasuk perbedaan masa lalu dan saat ini dalam fitur akselerasi perangkat keras dari kedua API.

Topik ini memiliki bagian-bagian berikut:

Perbedaan antara Direct2D dan GDI

GDI merender geometri buram dan alias seperti poligon, elipsis, dan garis. Ini merender teks alias dan ClearType, dan dapat mendukung perpaduan transparansi melalui ALPHABlend API. Namun, penanganan transparansinya tidak konsisten dan sebagian besar API GDI hanya mengabaikan saluran alfa. Beberapa API GDI menjamin apa yang akan dimuat saluran alfa setelah operasi. Lebih penting lagi, rendering GDI tidak memetakan dengan mudah ke operasi 3D, dan GPU modern merender paling efisien pada bagian 3D dari mesin penyajiannya. Misalnya, garis alias Direct2D dirancang untuk diimplementasikan hanya sebagai dua segitiga yang dirender pada GPU, sedangkan GDI menggunakan algoritma gambar garis Bresenham.

Direct2D merender primitif buram, transparan, alias, dan anti-alias. UI modern sering menggunakan transparansi dan animasi. Direct2D memudahkan untuk membuat UI modern karena memiliki jaminan ketat tentang bagaimana ia menerima dan merender konten transparan, dan semua primitifnya dirender menggunakan akselerasi perangkat keras. Direct2D bukan superset Murni GDI: primitif yang tidak masuk akal lambat ketika diimplementasikan pada GPU tidak ada di Direct2D. Karena Direct2D dibangun dengan penekanan pada akselerasi 3D ini juga mudah digunakan dengan Direct3D.

Sejak Windows NT 4, GDI telah berjalan dalam mode kernel. Aplikasi ini memanggil GDI yang kemudian memanggil rekan mode kernelnya yang meneruskan primitif ke model drivernya sendiri. Driver ini kemudian mengirimkan hasilnya ke driver tampilan mode kernel global.

Dimulai dengan Windows 2000, driver GDI dan GDI telah berjalan di ruang independen di kernel yang disebut "ruang sesi." Ruang alamat sesi dibuat untuk setiap sesi masuk, dan setiap instans GDI berjalan secara independen di ruang alamat mode kernel yang berbeda ini. Direct2D, bagaimanapun, berjalan dalam mode pengguna dan meneruskan perintah gambar melalui mode pengguna Driver Direct3D ke driver mode kernel.

gambar 1 - direct2d dibandingkan dengan gdi

Akselerasi perangkat keras GDI dan Direct2D

Perbedaan terpenting antara akselerasi perangkat keras Direct2D dan GDI adalah teknologi yang mendasar yang mendorongnya. Direct2D berlapis di atas Direct3D dan GDI memiliki model driver sendiri, GDI Device Driver Interface (DDI), yang sesuai dengan primitif GDI. Model driver Direct3D sesuai dengan apa yang dirender perangkat keras render 3D dalam GPU. Ketika GDI DDI pertama kali ditentukan, sebagian besar perangkat keras akselerasi tampilan menargetkan primitif GDI. Seiring waktu, semakin banyak penekanan ditempatkan pada akselerasi game 3D dan lebih sedikit pada akselerasi aplikasi. Sebagai konsekuensinya API BitBlt dipercepat perangkat keras dan sebagian besar operasi GDI lainnya tidak.

Ini mengatur tahap untuk urutan perubahan pada bagaimana GDI dirender ke tampilan. Ilustrasi berikut menunjukkan bagaimana penyajian tampilan GDI telah berubah dari Windows XP ke Windows 7.

gambar 2 - evolusi penyajian tampilan gdi

Ada juga sejumlah faktor tambahan yang menyebabkan perubahan pada model driver GDI , seperti yang dijelaskan di bawah ini.

Meningkatkan kompleksitas dan ukuran driver tampilan

Driver 3D telah menjadi lebih kompleks dari waktu ke waktu. Kode yang lebih kompleks cenderung memiliki lebih banyak cacat sehingga bermanfaat bagi driver untuk ada dalam mode pengguna di mana bug driver tidak dapat menyebabkan boot ulang sistem. Seperti yang dapat dilihat pada gambar di atas, driver tampilan dibagi menjadi komponen mode pengguna yang kompleks dan komponen mode kernel yang lebih sederhana.

Kesulitan dalam menyinkronkan sesi dan ruang alamat kernel global

Di Windows XP, driver tampilan ada di dua ruang alamat yang berbeda: ruang sesi dan ruang kernel. Bagian dari driver perlu merespons peristiwa seperti peristiwa manajemen daya. Ini perlu disinkronkan dengan status driver di ruang alamat sesi. Ini adalah tugas yang sulit dan dapat menyebabkan cacat ketika driver tampilan mencoba untuk menangani ruang alamat yang berbeda ini.

Manajemen jendela yang dikomposisi

Desktop Window Manager (DWM), manajer jendela komposit yang diperkenalkan di Windows 7, merender semua jendela ke permukaan di luar layar dan kemudian menyusunnya bersama-sama untuk ditampilkan di layar. Ini mengharuskan GDI untuk dapat merender ke permukaan yang kemudian akan dirender oleh Direct3D untuk ditampilkan. Ini menimbulkan masalah dalam model driver XP, karena GDI dan Direct3D adalah tumpukan driver paralel.

Akibatnya, di Windows Vista, driver tampilan GDI DDI diimplementasikan sebagai Driver Tampilan Kanonis (CDD) yang disediakan Microsoft yang merender konten GDI ke bitmap memori sistem untuk disusun ke layar.

Penyajian GDI di Windows 7

Model driver yang digunakan di Windows Vista mengharuskan setiap jendela GDI didukung oleh permukaan memori video dan permukaan memori sistem. Hal ini mengakibatkan memori sistem digunakan untuk setiap jendela GDI.

Untuk alasan ini, GDI diubah lagi di Windows 7. Alih-alih merender ke permukaan memori sistem, GDI dimodifikasi untuk dirender ke segmen memori aperture. Memori aperture dapat diperbarui dari permukaan memori video yang memegang konten jendela. GDI dapat merender kembali ke memori aperture, dan hasilnya kemudian dapat dikirim kembali ke permukaan jendela. Karena segmen memori aperture dapat diatasi oleh GPU, GPU dapat mempercepat pembaruan ini ke permukaan memori video. Misalnya, penyajian teks, BitBlts, AlphaBlend, TransparentBlt, dan StretchBlt semuanya dipercepat dalam kasus ini.

Kontras akselerasi Direct2D dan GDI di Windows 7

Direct2D dan GDI adalah API penyajian mode langsung 2D dan dipercepat perangkat keras. Namun, ada sejumlah perbedaan yang tetap ada di kedua API.

Lokasi sumber daya

GDI mempertahankan sumber dayanya, khususnya bitmap, dalam memori sistem secara default. Direct2D mempertahankan sumber dayanya dalam memori video pada adaptor tampilan. Ketika GDI perlu memperbarui memori video, ini harus dilakukan melalui bus, kecuali sumber daya sudah berada di segmen memori aperture atau jika operasi dapat diekspresikan secara langsung. Sebaliknya, Direct2D cukup menerjemahkan primitifnya ke primitif Direct3D karena sumber daya sudah ada di memori video.

Metode penyajian

Untuk menjaga kompatibilitas, GDI melakukan sebagian besar penyajiannya ke memori aperture menggunakan CPU. Sebaliknya, Direct2D menerjemahkan panggilan API-nya ke primitif Direct3D dan operasi menggambar. Hasilnya kemudian dirender pada GPU. Beberapa rendering GDI dilakukan pada GPU ketika memori aperture disalin ke permukaan memori video yang mewakili jendela GDI.

Skalabilitas

Panggilan penyajian Direct2D semuanya adalah aliran perintah independen ke GPU. Setiap pabrik Direct2D mewakili perangkat Direct3D yang berbeda. GDI menggunakan satu aliran perintah untuk semua aplikasi pada sistem. Metode GDI dapat mengakibatkan penusunan overhead konteks rendering GPU dan CPU.

Lokasi

Direct2D beroperasi sepenuhnya dalam mode pengguna, termasuk run time Direct3D dan driver Direct3D mode pengguna. Ini membantu mencegah crash sistem yang disebabkan oleh cacat kode di kernel. Namun, GDI memiliki sebagian besar fungsionalitasnya dalam ruang sesi dalam mode kernel, dengan permukaan API-nya dalam mode pengguna.

Ketersediaan Akselerasi Perangkat Keras

GDI dipercepat perangkat keras pada Windows XP, dan dipercepat pada Windows 7 ketika Manajer Jendela Desktop berjalan dan driver WDDM 1.1 sedang digunakan. Direct2D adalah perangkat keras yang dipercepat pada hampir semua driver WDDM dan apakah DWM sedang digunakan atau tidak. Di Vista, GDI akan selalu merender pada CPU.

Model Presentasi

Ketika Windows pertama kali dirancang, memori tidak mencukupi untuk memungkinkan setiap jendela disimpan dalam bitmapnya sendiri. Akibatnya, GDI selalu dirender secara logis langsung ke layar, dengan berbagai wilayah kliping diterapkan untuk memastikan bahwa aplikasi tidak merender di luar jendelanya. Dalam model Direct2D , aplikasi dirender ke back-buffer, dan hasilnya ditampilkan ketika aplikasi selesai menggambar. Ini memungkinkan Direct2D untuk menangani skenario animasi jauh lebih lancar daripada yang dapat dilakukan GDI.

Kesimpulan

Kode GDI yang ada akan terus berfungsi dengan baik di bawah Windows 7. Namun, saat menulis kode penyajian grafis baru, Direct2D harus dipertimbangkan, karena mengambil keuntungan yang lebih baik dari GPU modern.