Bagikan melalui


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 berfungsi 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 tak terduga memaksa pemrosesan untuk sepenuhnya beralih kembali 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 secara penuh. Ini menyediakan dua kategori sumber daya: perangkat independen dan bergantung pada perangkat.

  • 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 render dilakukan dengan menggabungkan informasi vertex dan cakupan pada geometri dengan informasi tekstur yang dihasilkan oleh sumber daya tergantung 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 resource manager. Selain peningkatan performa umum yang disediakan oleh penghapusan manajer sumber daya, model ini memungkinkan Anda untuk langsung mengontrol penyajian perantara apa pun.

Karena Direct2D menyediakan 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, yang merupakan sumber daya independen perangkat itu sendiri, untuk membuat sumber daya independen perangkat. (Untuk membuat pabrik, gunakan fungsiCreateFactory.)

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

Device-Dependent Sumber Daya

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-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.

Nota

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 ID2D1Deviceyang 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 membagikan semua sumber daya yang tidak bergantung pada perangkat yang dibuat oleh faktori dengan semua sumber daya lainnya (baik yang tidak bergantung maupun yang bergantung pada perangkat) yang dibuat oleh faktori yang sama. Misalnya, Anda dapat menggunakan dua objek ID2D1RenderTarget untuk menggambar ID2D1RectangleGeometry yang sama jika kedua objek ID2D1RenderTarget 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 Anda sendiri dari ID2D1SimplifiedGeometrySink.

Berbagi Sumber Daya Render Target

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—akhirnya dapat diproses pada perangkat keras lokal, perangkat lunak, atau perangkat keras milik klien yang terhubung dari 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 mana pun yang secara eksplisit menggunakan perangkat keras, selama mode akses jarak jauh kompatibel. Mode pemindahan jarak jauh hanya dijamin kompatibel ketika kedua target render menggunakan flag penggunaan D2D1_RENDER_TARGET_USAGE_FORCE_BITMAP_REMOTING atau D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE, atau jika tidak ada flag yang ditentukan. Pengaturan ini menjamin bahwa sumber daya akan selalu berada di komputer yang sama. Untuk menentukan mode penggunaan, atur bidang penggunaan dari struktur D2D1_RENDER_TARGET_PROPERTIES yang Anda gunakan untuk membuat target render dengan satu atau beberapa flag D2D1_RENDER_TARGET_USAGE.

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

Target Pengerjaan Permukaan DXGI

Anda dapat berbagi sumber daya yang dibuat oleh target render permukaan DXGI dengan target render permukaan DXGI lainnya yang menggunakan perangkat Direct3D yang mendasar 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 berhasil. Metode ini akan berhasil selama dua target render menggunakan perangkat yang mendasar yang sama untuk penyajian.