Pengantar Multithreading di Direct3D 11

Multithreading dirancang untuk meningkatkan performa dengan melakukan pekerjaan menggunakan satu atau beberapa utas secara bersamaan.

Di masa lalu, ini sering dilakukan dengan menghasilkan satu utas utama untuk penyajian dan satu atau beberapa utas untuk melakukan pekerjaan persiapan seperti pembuatan objek, pemuatan, pemrosesan, dan sebagainya. Namun, dengan sinkronisasi bawaan di Direct3D 11, tujuan di balik multithreading adalah untuk memanfaatkan setiap siklus CPU dan GPU tanpa membuat prosesor menunggu prosesor lain (terutama tidak membuat GPU menunggu karena berdampak langsung pada kecepatan bingkai). Dengan demikian, Anda dapat menghasilkan jumlah pekerjaan terbanyak sambil mempertahankan kecepatan bingkai terbaik. Konsep satu bingkai untuk penyajian tidak lagi diperlukan karena API menerapkan sinkronisasi.

Multithreading memerlukan beberapa bentuk sinkronisasi. Misalnya, jika beberapa utas yang berjalan dalam aplikasi harus mengakses konteks perangkat tunggal (ID3D11DeviceContext), aplikasi tersebut harus menggunakan beberapa mekanisme sinkronisasi, seperti bagian penting, untuk menyinkronkan akses ke konteks perangkat tersebut. Ini karena pemrosesan perintah render (umumnya dilakukan pada GPU) dan menghasilkan perintah render (umumnya dilakukan pada CPU melalui pembuatan objek, pemuatan data, perubahan status, pemrosesan data) sering menggunakan sumber daya yang sama (tekstur, shader, status alur, dan sebagainya). Mengatur pekerjaan di beberapa utas memerlukan sinkronisasi untuk mencegah satu utas memodifikasi atau membaca data yang sedang dimodifikasi oleh utas lain.

Meskipun penggunaan konteks perangkat (ID3D11DeviceContext) tidak aman untuk utas, penggunaan perangkat Direct3D 11 (ID3D11Device) aman untuk utas. Karena setiap ID3D11DeviceContext adalah utas tunggal, hanya satu utas yang dapat memanggil ID3D11DeviceContext pada satu waktu. Jika beberapa utas harus mengakses satu ID3D11DeviceContext, mereka harus menggunakan beberapa mekanisme sinkronisasi, seperti bagian penting, untuk menyinkronkan akses ke ID3D11DeviceContext tersebut. Namun, beberapa utas tidak diperlukan untuk menggunakan bagian penting atau primitif sinkronisasi untuk mengakses satu ID3D11Device. Oleh karena itu, jika aplikasi menggunakan ID3D11Device untuk membuat objek sumber daya, aplikasi tersebut tidak diperlukan untuk menggunakan sinkronisasi untuk membuat beberapa objek sumber daya secara bersamaan.

Dukungan multithreading membagi API menjadi dua area fungsi yang berbeda:

Performa multithreading tergantung pada dukungan driver. Cara: Periksa Dukungan Driver menyediakan informasi selengkapnya tentang mengkueri driver dan apa arti hasilnya.

Direct3D 11 telah dirancang dari bawah ke atas untuk mendukung multithreading. Direct3D 10 menerapkan dukungan terbatas untuk multithreading menggunakan lapisan thread-safe. Halaman ini mencantumkan perbedaan perilaku antara dua versi DirectX: Perbedaan Utas antara Versi Direct3D.

Multithreading dan DXGI

Hanya satu utas pada satu waktu yang harus menggunakan konteks langsung. Namun, aplikasi Anda juga harus menggunakan utas yang sama untuk operasi Microsoft DirectX Graphics Infrastructure (DXGI), terutama ketika aplikasi melakukan panggilan ke metode IDXGISwapChain::P resent .

Catatan

Tidak valid untuk menggunakan konteks langsung secara bersamaan dengan sebagian besar fungsi antarmuka DXGI. Untuk SDK DirectX Maret 2009 dan yang lebih baru, satu-satunya fungsi DXGI yang aman adalah AddRef, Release, dan QueryInterface.

 

Untuk informasi selengkapnya tentang menggunakan DXGI dengan beberapa utas, lihat Pertimbangan Multithread.

Multiutas