Gambaran Umum Sumber Daya

Sumber daya Direct2D adalah objek yang digunakan untuk menggambar dan diwakili oleh antarmuka Direct2D, seperti ID2D1Geometry atau ID2D1RenderTarget. Topik ini menjelaskan jenis sumber daya Direct2D dan bagaimana mereka dapat dibagikan.

Topik ini berisi bagian berikut:

Tentang Sumber Daya Direct2D

Banyak API 2D yang dipercepat perangkat keras dirancang di sekitar model sumber daya yang berfokus pada CPU dan serangkaian operasi penyajian yang bekerja dengan baik pada CPU. Kemudian, beberapa bagian dari API dipercepat perangkat keras. Menerapkan API ini memerlukan manajer sumber daya untuk memetakan sumber daya CPU ke sumber daya pada GPU. Karena keterbatasan GPU, beberapa operasi mungkin tidak dapat dipercepat dalam setiap keadaan. Dalam kasus ini, manajer sumber daya harus berkomunikasi bolak-balik antara CPU dan GPU (yang mahal) sehingga dapat beralih ke penyajian CPU. Dalam beberapa kasus, mungkin secara tidak terduga memaksa penyajian untuk kembali sepenuhnya ke CPU. Selain itu, operasi penyajian yang tampak sederhana mungkin memerlukan langkah-langkah penyajian perantara sementara yang tidak terekspos di API dan yang memerlukan sumber daya GPU tambahan.

Direct2D menyediakan pemetaan yang lebih langsung untuk memanfaatkan GPU sepenuhnya. Ini menyediakan dua kategori sumber daya: device-independent dan device-dependent.

  • Sumber daya independen perangkat, seperti ID2D1Geometry, disimpan di CPU.
  • Sumber daya yang bergantung pada perangkat, seperti ID2D1RenderTarget dan ID2D1LinearGradientBrush, langsung memetakan ke sumber daya pada GPU (saat akselerasi perangkat keras tersedia). Panggilan penyajian dilakukan dengan menggabungkan informasi vertex dan cakupan dari geometri dengan informasi tekstual yang dihasilkan oleh sumber daya yang bergantung pada perangkat.

Saat Anda membuat sumber daya yang bergantung pada perangkat, sumber daya sistem (GPU, jika tersedia, atau CPU) dialokasikan saat perangkat dibuat dan tidak berubah dari satu operasi penyajian ke operasi penyajian lainnya. Situasi ini menghilangkan kebutuhan akan manajer sumber daya. Selain peningkatan performa umum yang disediakan oleh penghapusan manajer sumber daya, model ini memungkinkan Anda untuk secara langsung mengontrol penyajian perantara.

Karena Direct2D memberikan begitu banyak kontrol atas sumber daya, Anda harus memahami berbagai jenis sumber daya dan kapan sumber daya tersebut dapat digunakan bersama-sama.

Sumber Daya Device-Independent

Seperti yang dijelaskan di bagian sebelumnya, sumber daya independen perangkat selalu berada di CPU dan tidak pernah dikaitkan dengan perangkat penyajian perangkat keras. Berikut ini adalah sumber daya independen perangkat:

Gunakan ID2D1Factory, sumber daya independen perangkat, untuk membuat sumber daya independen perangkat. (Untuk membuat pabrik, gunakan fungsi CreateFactory .)

Kecuali untuk target render, semua sumber daya yang dibuat oleh pabrik tidak bergantung pada perangkat. Target render adalah sumber daya yang bergantung pada perangkat.

Sumber Daya Device-Dependent

Sumber daya apa pun yang tidak dinamai dalam daftar sebelumnya adalah sumber daya yang bergantung pada perangkat. Sumber daya yang bergantung pada perangkat dikaitkan dengan perangkat penyajian tertentu. Ketika akselerasi perangkat keras tersedia, perangkat tersebut adalah GPU. Dalam kasus lain, itu adalah CPU.

Untuk membuat sebagian besar sumber daya yang bergantung pada perangkat, gunakan target render. Dalam kebanyakan kasus, gunakan pabrik untuk membuat target render.

Berikut ini adalah contoh sumber daya yang bergantung pada perangkat:

  • ID2D1Brush dan antarmuka yang mewarisinya. Gunakan target render untuk membuat kuas.
  • ID2D1Layer. Gunakan target render untuk membuat lapisan.
  • ID2D1RenderTarget dan antarmuka yang mewarisinya. Untuk membuat target render, gunakan pabrik atau target render lainnya.

Catatan

Dimulai dengan Windows 8, ada antarmuka baru yang membuat sumber daya dependen perangkat. ID2D1Device dan ID2D1DeviceContext dapat berbagi sumber daya jika konteks perangkat dan sumber daya dibuat dari ID2D1Device yang sama.

 

Sumber daya yang bergantung pada perangkat menjadi tidak dapat digunakan ketika perangkat penyajian terkait menjadi tidak tersedia. Ini berarti bahwa ketika Anda menerima kesalahan D2DERR_RECREATE_TARGET untuk target render, Anda harus membuat ulang target render dan semua sumber dayanya.

Berbagi Sumber Daya Pabrik

Anda dapat berbagi semua sumber daya independen perangkat yang dibuat oleh pabrik dengan semua sumber daya lain (independen perangkat atau bergantung pada perangkat) yang dibuat oleh pabrik yang sama. Misalnya, Anda dapat menggunakan dua objek ID2D1RenderTarget untuk menggambar ID2D1RectangleGeometry yang sama jika kedua objek ID2D1RenderTarget tersebut dibuat oleh pabrik yang sama.

Antarmuka sink (ID2D1SimplifiedGeometrySink, ID2D1GeometrySink, dan ID2D1TessellationSink) dapat dibagikan dengan sumber daya yang dibuat oleh pabrik apa pun. Tidak seperti antarmuka lain di Direct2D, implementasi antarmuka sink apa pun dapat digunakan. Misalnya, Anda dapat menggunakan implementasi ID2D1SimplifiedGeometrySink Anda sendiri.

Berbagi Sumber Daya Target Render

Kemampuan Anda untuk berbagi sumber daya yang dibuat oleh target render bergantung pada jenis target render. Saat Anda membuat target render jenis D2D1_RENDER_TARGET_TYPE_DEFAULT, sumber daya yang dibuat oleh target render tersebut hanya dapat digunakan oleh target render tersebut (kecuali target render cocok dengan salah satu kategori yang dijelaskan di bagian berikut). Ini terjadi karena Anda tidak tahu perangkat apa yang akan digunakan target render—hal ini dapat berakhir dengan penyajian ke perangkat keras lokal, perangkat lunak, atau perangkat keras klien jarak jauh. Misalnya, Anda dapat menulis program yang berhenti berfungsi ketika ditampilkan dari jarak jauh atau ketika target render ditingkatkan ukurannya melebihi ukuran maksimum yang didukung oleh perangkat keras penyajian.

Bagian berikut menjelaskan keadaan di mana sumber daya yang dibuat oleh satu target render dapat dibagikan dengan target render lain.

Target Render Perangkat Keras

Anda dapat berbagi sumber daya antara target render apa pun yang secara eksplisit menggunakan perangkat keras, selama mode jarak jauh kompatibel. Mode jarak jauh hanya dijamin kompatibel ketika kedua target render menggunakan bendera penggunaan D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING atau D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE , atau jika tidak ada bendera yang ditentukan. Pengaturan ini menjamin bahwa sumber daya akan selalu berada di komputer yang sama. Untuk menentukan mode penggunaan, atur bidang penggunaan struktur D2D1_RENDER_TARGET_PROPERTIES yang Anda gunakan untuk membuat target render dengan satu atau beberapa bendera D2D1_RENDER_TARGET_USAGE .

Untuk membuat target render yang secara eksplisit menggunakan penyajian perangkat keras, atur bidang jenis struktur D2D1_RENDER_TARGET_PROPERTIES yang Anda gunakan untuk membuat target render ke D2D1_RENDER_TARGET_TYPE_HARDWARE.

Target Render Permukaan DXGI

Anda dapat berbagi sumber daya yang dibuat oleh target render permukaan DXGI dengan target render permukaan DXGI lainnya yang menggunakan perangkat Direct3D dasar yang sama.

Target Render yang Kompatibel dan Bitmap Bersama

Anda dapat berbagi sumber daya antara target render dan target render yang kompatibel yang dibuat oleh target render tersebut. Untuk membuat target render yang kompatibel, gunakan metode ID2D1RenderTarget::CreateCompatibleRenderTarget .

Anda dapat menggunakan metode ID2D1RenderTarget::CreateSharedBitmap untuk membuat ID2D1Bitmap yang dapat dibagikan antara dua target render yang ditentukan dalam panggilan metode, jika metode berhasil. Metode ini akan berhasil selama dua target render menggunakan perangkat yang mendasar yang sama untuk penyajian.