Pengantar Perangkat di Direct3D 11

Model objek Direct3D 11 memisahkan fungsionalitas pembuatan dan penyajian sumber daya ke dalam perangkat dan satu atau beberapa konteks; pemisahan ini dirancang untuk memfasilitasi multithreading.

Perangkat

Perangkat digunakan untuk membuat sumber daya dan menghitung kemampuan adaptor tampilan. Di Direct3D 11, perangkat diwakili dengan antarmuka ID3D11Device .

Setiap aplikasi harus memiliki setidaknya satu perangkat, sebagian besar aplikasi hanya membuat satu perangkat. Buat perangkat untuk salah satu driver perangkat keras yang diinstal pada komputer Anda dengan memanggil D3D11CreateDevice atau D3D11CreateDeviceAndSwapChain dan tentukan jenis driver dengan bendera D3D_DRIVER_TYPE . Setiap perangkat dapat menggunakan satu atau beberapa konteks perangkat, tergantung pada fungsionalitas yang diinginkan.

Konteks Perangkat

Konteks perangkat berisi keadaan atau pengaturan tempat perangkat digunakan. Lebih khusus lagi, konteks perangkat digunakan untuk mengatur status alur dan menghasilkan perintah penyajian menggunakan sumber daya yang dimiliki oleh perangkat. Direct3D 11 mengimplementasikan dua jenis konteks perangkat, satu untuk penyajian langsung dan yang lainnya untuk penyajian yang ditangguhkan; kedua konteks diwakili dengan antarmuka ID3D11DeviceContext .

Konteks Langsung

Konteks langsung dirender langsung ke driver. Setiap perangkat memiliki satu dan hanya satu konteks langsung yang dapat mengambil data dari GPU. Konteks langsung dapat digunakan untuk segera merender (atau memutar kembali) daftar perintah.

Ada dua cara untuk mendapatkan konteks langsung:

Konteks Yang Ditangguhkan

Konteks yang ditangguhkan merekam perintah GPU ke dalam daftar perintah. Konteks yang ditangguhkan terutama digunakan untuk multithreading dan tidak diperlukan untuk aplikasi satu utas. Konteks yang ditangguhkan umumnya digunakan oleh utas pekerja alih-alih utas penyajian utama. Saat Anda membuat konteks yang ditangguhkan, konteks tersebut tidak mewarisi status apa pun dari konteks langsung.

Untuk mendapatkan konteks yang ditangguhkan, panggil ID3D11Device::CreateDeferredContext.

Konteks apa pun -- langsung atau ditangguhkan -- dapat digunakan pada utas apa pun selama konteks hanya digunakan dalam satu utas pada satu waktu.

Pertimbangan Utas

Tabel ini menyoroti perbedaan model utas di Direct3D 11 dari versi Direct3D sebelumnya.

Perbedaan antara Direct3D 11 dan versi Direct3D sebelumnya:
Semua metode antarmuka ID3D11Device berulir bebas, yang berarti aman untuk memiliki beberapa utas yang memanggil fungsi secara bersamaan.

  • Semua antarmuka turunan ID3D11DeviceChild (ID3D11Buffer, ID3D11Query, dll.) berutas bebas.
  • Direct3D 11 membagi sumber daya yang membuat dan merender menjadi dua antarmuka. Map, Unmap, Begin, End, dan GetData diimplementasikan pada ID3D11DeviceContext karena ID3D11Device sangat menentukan urutan operasi. Antarmuka ID3D11Resource dan ID3D11Asynchronous juga menerapkan metode untuk operasi utas bebas.
  • Metode ID3D11DeviceContext (kecuali yang ada di ID3D11DeviceChild) tidak berutas bebas, yaitu, mereka memerlukan utas tunggal. Hanya satu utas yang dapat dengan aman memanggil salah satu metodenya (Gambar, Salin, Peta, dll.) pada satu waktu.
  • Secara umum, utas bebas meminimalkan jumlah primitif sinkronisasi yang digunakan serta durasinya. Namun, aplikasi yang menggunakan sinkronisasi yang diadakan untuk waktu yang lama dapat langsung berdampak pada berapa banyak konkurensi yang dapat diharapkan aplikasi.
Metode antarmuka ID3D10Device tidak dirancang untuk menjadi utas bebas. ID3D10Device mengimplementasikan semua fungsionalitas pembuatan dan penyajian (seperti halnya ID3D9Device di Direct3D 9. Peta dan Unmap diimplementasikan pada antarmuka turunan ID3D10Resource, Begin, End, dan GetData diimplementasikan pada antarmuka turunan ID3D10Asynchronous.

Perangkat