Bagikan melalui


Perubahan Penting dari Direct3D 11 ke Direct3D 12

Direct3D 12 mewakili keberangkatan yang signifikan dari model pemrograman Direct3D 11. Direct3D 12 memungkinkan aplikasi lebih dekat ke perangkat keras daripada sebelumnya. Dengan lebih dekat dengan perangkat keras, Direct3D 12 lebih cepat dan lebih efisien. Namun, trade-off aplikasi Anda telah meningkatkan kecepatan dan efisiensi dengan Direct3D 12 adalah Anda bertanggung jawab atas lebih banyak tugas daripada yang Anda lakukan dengan Direct3D 11.

Direct3D 12 adalah kembali ke pemrograman tingkat rendah; ini memberi Anda lebih banyak kontrol atas elemen grafis game dan aplikasi Anda dengan memperkenalkan fitur-fitur baru ini: objek untuk mewakili status keseluruhan alur, daftar perintah dan bundel untuk pengiriman kerja, dan tumpukan deskriptor dan tabel untuk akses sumber daya.

Aplikasi Anda telah meningkatkan kecepatan dan efisiensi dengan Direct3D 12, tetapi Anda bertanggung jawab atas lebih banyak tugas daripada yang Anda gunakan dengan Direct3D 11.

Sinkronisasi Eksplisit

  • Di Direct3D 12, sinkronisasi CPU-GPU sekarang menjadi tanggung jawab eksplisit aplikasi dan tidak lagi secara implisit dilakukan oleh runtime, seperti yang ada di Direct3D 11. Fakta ini juga berarti bahwa tidak ada pemeriksaan otomatis untuk bahaya alur yang dilakukan oleh Direct3D 12, jadi sekali lagi ini adalah tanggung jawab aplikasi.
  • Di Direct3D 12, aplikasi bertanggung jawab untuk menyalurkan pembaruan data. Artinya, pola "Map/Lock-DISCARD" di Direct3D 11 harus dilakukan secara manual di Direct3D 12. Di Direct3D 11, jika GPU masih menggunakan buffer saat Anda memanggil ID3D11DeviceContext::Map dengan D3D11_MAP_WRITE_DISCARD, runtime mengembalikan pointer ke wilayah memori baru alih-alih data buffer lama. Ini memungkinkan GPU untuk terus menggunakan data lama sementara aplikasi menempatkan data di buffer baru. Tidak diperlukan manajemen memori tambahan di aplikasi; buffer lama digunakan kembali atau dihancurkan secara otomatis ketika GPU selesai dengannya.
  • Di Direct3D 12, semua pembaruan dinamis (termasuk buffer konstan, buffer vertex dinamis, tekstur dinamis, dan sebagainya) secara eksplisit dikontrol oleh aplikasi. Pembaruan dinamis ini mencakup pagar GPU atau buffering yang diperlukan. Aplikasi ini bertanggung jawab untuk menjaga memori tetap tersedia sampai tidak lagi diperlukan.
  • Direct3D 12 menggunakan referensi gaya COM yang dihitung hanya untuk masa pakai antarmuka (dengan menggunakan model referensi Direct3D yang lemah yang terkait dengan masa pakai perangkat). Semua masa pakai memori sumber daya dan deskripsi adalah satu-satunya tanggung jawab aplikasi untuk dipertahankan selama durasi yang tepat, dan bukan referensi yang dihitung. Direct3D 11 menggunakan penghitungan referensi untuk mengelola masa pakai dependensi antarmuka juga.

Manajemen Residensi Memori Fisik

Aplikasi Direct3D 12 harus mencegah kondisi balapan antara beberapa antrean, beberapa adaptor, dan utas CPU. D3D12 tidak lagi menyinkronkan CPU dan GPU, juga tidak mendukung mekanisme yang nyaman untuk penggantian nama sumber daya atau multi-buffering. Pagar harus digunakan untuk menghindari beberapa unit pemrosesan dari memori penulisan berlebihan sebelum unit pemrosesan lain selesai menggunakannya.

Aplikasi Direct3D 12 harus memastikan data berada dalam memori saat GPU membacanya. Memori yang digunakan oleh setiap objek dibuat residen selama pembuatan objek. Aplikasi yang memanggil metode ini harus menggunakan pagar untuk memastikan GPU tidak mengakses objek yang telah dikeluarkan.

Hambatan sumber daya adalah jenis sinkronisasi lain yang diperlukan, digunakan untuk menyinkronkan transisi sumber daya dan sub sumber daya pada tingkat yang sangat terperinci.

Lihat Manajemen Memori di Direct3D 12.

Objek status alur

Direct3D 11 memungkinkan manipulasi status alur melalui sekumpulan besar objek independen. Misalnya, status perakitan input, status shader piksel, status rasterizer, dan status penggabungan output semuanya dapat dimodifikasi secara independen. Desain ini memberikan representasi alur grafis yang nyaman dan relatif tinggi, tetapi tidak menggunakan kemampuan perangkat keras modern, terutama karena berbagai status sering saling bergantung. Misalnya, banyak GPU menggabungkan shader piksel dan status penggabungan output ke dalam satu representasi perangkat keras. Tetapi karena API Direct3D 11 memungkinkan tahapan alur ini diatur secara terpisah, driver tampilan tidak dapat menyelesaikan masalah status alur hingga status selesai, yang tidak sampai waktu draw. Skema ini menunda penyiapan status perangkat keras, yang berarti overhead ekstra dan lebih sedikit panggilan gambar maksimum per bingkai.

Direct3D 12 membahas skema ini dengan menyatukan sebagian besar status alur ke dalam objek status alur (PSO) yang tidak dapat diubah, yang diselesaikan setelah pembuatan. Perangkat keras dan driver kemudian dapat segera mengonversi PSO menjadi instruksi dan status asli perangkat keras apa pun yang diperlukan untuk menjalankan pekerjaan GPU. Anda masih dapat secara dinamis mengubah PSO mana yang digunakan, tetapi untuk melakukannya, perangkat keras hanya perlu menyalin jumlah minimal status pra-komputasi langsung ke daftar perangkat keras, daripada menghitung status perangkat keras dengan cepat. Dengan menggunakan PSO, overhead panggilan gambar berkurang secara signifikan, dan banyak lagi panggilan gambar dapat terjadi per bingkai. Untuk informasi selengkapnya tentang PSO, lihat Mengelola status alur grafis di Direct3D 12.

Daftar perintah dan bundel

Dalam Direct3D 11, semua pengiriman pekerjaan dilakukan melalui konteks langsung, yang mewakili satu aliran perintah yang masuk ke GPU. Untuk mencapai penskalaan multithreaded, game juga memiliki konteks yang ditangguhkan yang tersedia untuk mereka. Konteks yang ditangguhkan dalam Direct3D 11 tidak dipetakan dengan sempurna ke perangkat keras, sehingga pekerjaan yang relatif sedikit dapat dilakukan di dalamnya.

Direct3D 12 memperkenalkan model baru untuk pengiriman kerja berdasarkan daftar perintah yang berisi keseluruhan informasi yang diperlukan untuk menjalankan beban kerja tertentu pada GPU. Setiap daftar perintah baru berisi informasi seperti PSO mana yang akan digunakan, tekstur dan sumber daya buffer apa yang diperlukan, dan argumen untuk semua panggilan gambar. Karena setiap daftar perintah mandiri dan tidak mewarisi status, driver dapat melakukan pra-komputasi semua perintah GPU yang diperlukan di depan dan dengan cara berulir bebas. Satu-satunya proses serial yang diperlukan adalah pengiriman akhir daftar perintah ke GPU melalui antrean perintah.

Selain daftar perintah, Direct3D 12 juga memperkenalkan tingkat kedua pra-komputasi kerja: bundel. Tidak seperti daftar perintah, yang sepenuhnya mandiri dan biasanya dibangun, dikirim sekali, dan dibuang, bundel menyediakan bentuk warisan status yang memungkinkan penggunaan kembali. Misalnya, jika game ingin menggambar dua model karakter dengan tekstur yang berbeda, salah satu pendekatannya adalah merekam daftar perintah dengan dua set panggilan gambar yang identik. Tetapi pendekatan lain adalah "merekam" satu bundel yang menggambar model karakter tunggal, lalu "putar kembali" bundel dua kali pada daftar perintah menggunakan sumber daya yang berbeda. Dalam kasus terakhir, driver tampilan hanya harus menghitung instruksi yang sesuai sekali, dan membuat daftar perintah pada dasarnya berjumlah dua panggilan fungsi berbayar rendah.

Untuk informasi selengkapnya tentang daftar perintah dan bundel, lihat Kiriman Kerja di Direct3D 12.

Timbunan dan tabel deskriptor

Pengikatan sumber daya di Direct3D 11 sangat abstrak dan nyaman, tetapi membuat banyak kemampuan perangkat keras modern kurang digunakan. Di Direct3D 11, game membuat objek tampilan sumber daya, lalu mengikat tampilan tersebut ke beberapa slot pada berbagai tahap shader dalam alur. Shader, pada gilirannya, membaca data dari slot ikatan eksplisit tersebut, yang diperbaiki pada waktu gambar. Model ini berarti bahwa setiap kali game akan menggambar menggunakan sumber daya yang berbeda, ia harus mengikat kembali tampilan yang berbeda ke slot yang berbeda, dan memanggil gambar lagi. Kasus ini juga mewakili overhead yang dapat dihilangkan dengan sepenuhnya memanfaatkan kemampuan perangkat keras modern.

Direct3D 12 mengubah model pengikatan agar sesuai dengan perangkat keras modern dan secara signifikan meningkatkan performa. Alih-alih membutuhkan tampilan sumber daya mandiri dan pemetaan eksplisit ke slot, Direct3D 12 menyediakan tumpukan deskriptor tempat game membuat berbagai tampilan sumber daya mereka. Skema ini menyediakan mekanisme bagi GPU untuk langsung menulis deskripsi sumber daya asli perangkat keras (deskriptor) ke memori di muka. Untuk menyatakan sumber daya mana yang akan digunakan oleh alur untuk panggilan gambar tertentu, game menentukan satu atau beberapa tabel deskriptor yang mewakili sub-rentang tumpukan deskriptor lengkap. Karena timbunan deskriptor telah diisi dengan data deskriptor khusus perangkat keras yang sesuai, mengubah tabel deskriptor adalah operasi dengan biaya yang sangat rendah.

Selain peningkatan performa yang ditawarkan oleh tumpukan dan tabel deskriptor, Direct3D 12 juga memungkinkan sumber daya untuk diindeks secara dinamis dalam shader, yang memberikan fleksibilitas yang belum pernah terjadi sebelumnya dan membuka kunci teknik penyajian baru. Sebagai contoh, mesin penyajian modern yang ditangguhkan biasanya mengodekan pengidentifikasi material atau objek dari beberapa jenis ke g-buffer perantara. Dalam Direct3D 11, mesin ini harus berhati-hati untuk menghindari penggunaan terlalu banyak bahan, karena termasuk terlalu banyak dalam satu g-buffer dapat secara signifikan memperlambat lulus render akhir. Dengan sumber daya yang dapat diindeks secara dinamis, adegan dengan seribu bahan dapat diselesaikan secepat satu dengan hanya sepuluh.

Untuk informasi selengkapnya tentang tumpukan dan tabel deskriptor, lihat Pengikatan Sumber Daya, dan Perbedaan dalam Model Pengikatan dari Direct3D 11.

Porting dari Direct3D 11

Porting dari Direct3D 11 adalah proses yang terlibat, yang dijelaskan dalam Porting dari Direct3D 11 ke Direct3D 12. Lihat juga rentang opsi dalam Bekerja dengan Direct3D 11, Direct3D 10 dan Direct2D.

Memahami Direct3D 12