Apa keuntungan dari mekanisme akses keadaan langsung OpenGL?


11

Saya telah membaca tentang OpenGL 4.5 Direct State Access (DSA) di opengl.org dan tidak yakin apakah saya sudah benar.

Tampaknya menyiratkan, bahwa cara lama kurang efisien:

glBind(something)
glSetA(..)
glSetB(..)
glSetC(..)

dari cara baru:

glSetA(something, ..)
glSetB(something, ..)
glSetC(something, ..)

Dari tampilannya sekarang masing-masing glSetharus memasukkan glBind(something)di dalamnya dan jika OpenGL masih menjadi mesin-negara tidak dapat mengambil keuntungan dari perubahan yang dialirkan yang diterapkan pada satu something.

Tolong jelaskan alasan di balik dan keuntungan dari DSA baru.

Jawaban:


21

Dari tampilannya sekarang setiap glSet harus menyertakan glBind (sesuatu) di dalamnya

Tidak persis. Sebaliknya, seperti dijelaskan beberapa paragraf di bawah ini.

Bahkan jika itu benar, ingatlah bahwa perintah GL dari aplikasi klien ke server GL (alias driver) memiliki banyak overhead pengiriman dibandingkan dengan panggilan fungsi biasa. Bahkan jika kita mengasumsikan bahwa fungsi DSA hanya pembungkus di sekitar fungsi yang ada, mereka adalah pembungkus yang hidup di dalam server GL dan karenanya dapat memiliki (sedikit) overhead yang lebih sedikit.

jika OpenGL masih menjadi mesin negara tidak dapat mengambil keuntungan dari perubahan streaming yang diterapkan pada sesuatu.

GPU bukan mesin negara. Antarmuka mesin keadaan GL adalah emulasi yang membungkus internal driver seperti DSA, bukan sebaliknya.

Menghapus satu lapisan pembungkus - lapisan yang membutuhkan jumlah panggilan yang berlebihan ke server GL - jelas merupakan kemenangan, meskipun kecil.

Pendekatan mesin negara juga tidak masuk akal ketika berhadapan dengan banyak utas; GL masih mengerikan dalam kasus penggunaan ini tetapi driver sering menggunakan utas di belakang layar, dan mesin negara membutuhkan banyak sinkronisasi utas atau algoritma / konstruksi paralel yang sangat bagus untuk membuat segala sesuatunya bekerja dengan andal.

Perpanjangan DSA melanjutkan frasa operasinya dalam hal perubahan status karena, bagaimanapun juga, ekstensi ke dokumen berbasis negara yang ada dan bukan API yang sama sekali baru, sehingga harus siap untuk menyambungkan ke spesifikasi GL yang ada bahasa dan terminologi dokumen. Bahkan jika bahasa yang ada sangat cocok untuk pekerjaannya sebagai API perangkat keras grafis modern.

Tolong jelaskan alasan di balik dan keuntungan dari DSA baru.

Alasan terbesarnya adalah bahwa cara lama itu menyakitkan. Itu membuatnya sangat sulit untuk menyusun pustaka bersama yang mungkin masing-masing memodifikasi atau mengandalkan keadaan GL. Itu membuatnya sulit untuk secara efisien membungkus API GL dalam gaya berorientasi objek atau fungsional karena akar manajemen keadaan prosedural yang dalam, yang membuat membungkus API dalam berbagai bahasa non-C sulit dan juga membuatnya sulit untuk menyediakan pembungkus perangkat grafis yang efisien OpenGL abstrak itu dari Direct3D.

Kedua adalah overhead API mesin-prosedural, seperti dijelaskan sebelumnya.

Ketiga, fungsi DSA mengubah semantik jika perlu dari API lama yang memungkinkan peningkatan efisiensi. Hal-hal yang sebelumnya bisa berubah dibuat tidak berubah, misalnya, yang menghilangkan banyak kode pembukuan dari server GL. Panggilan oleh aplikasi dapat dikirim ke perangkat keras atau divalidasi lebih cepat (atau dalam mode yang lebih paralel) ketika server GL tidak harus berurusan dengan objek yang bisa berubah.

-

Penjelasan dan penjelasan tambahan diberikan dalam spesifikasi ekstensi EXT_direct_state_access .

-

Perubahan perangkat keras yang relevan dengan desain API agak banyak.

Ingat bahwa OpenGL tanggal kembali ke 1991. Perangkat keras target bukan kartu grafis kelas konsumen (yang tidak ada) tetapi workstation CAD besar dan sejenisnya. Perangkat keras zaman itu memiliki amplop kinerja yang sangat berbeda dari hari ini; multi-threading lebih jarang, bus memori dan CPU memiliki lebih sedikit celah kecepatan, dan GPU melakukan sedikit lebih banyak daripada rendering fungsi segitiga.

Semakin banyak fitur fungsi tetap ditambahkan. Berbagai model pencahayaan, mode tekstur, dll. Semuanya ditambahkan, masing-masing membutuhkan bagian negara mereka masing-masing. Pendekatan sederhana berbasis negara bekerja ketika Anda memiliki beberapa negara. Karena semakin banyak negara ditambahkan, API mulai meledak di jahitannya. API menjadi lebih canggung tetapi tidak menyimpang terlalu jauh dari mode perangkat keras, karena memang didasarkan pada banyak saklar negara.

Kemudian, datanglah perangkat keras yang dapat diprogram. Perangkat keras telah menjadi lebih dan lebih dapat diprogram, ke titik di mana sekarang, perangkat keras mendukung sedikit keadaan, beberapa program yang disediakan pengguna, dan banyak buffer. Semua keadaan dari era sebelumnya harus ditiru, sama seperti semua fitur fungsi tetap dari era yang ditiru oleh driver.

Perangkat keras juga berubah menjadi lebih dan lebih paralel. Ini mengharuskan perancangan ulang perangkat keras lain yang membuat perubahan kondisi grafis sangat mahal. Perangkat keras bekerja di blok besar negara yang tidak dapat diubah. Karena perubahan ini, pengandar tidak bisa hanya menerapkan setiap sedikit keadaan yang ditetapkan pengguna segera, tetapi harus mengelompokkan perubahan secara otomatis dan menerapkannya bila diperlukan secara implisit.

Perangkat keras modern beroperasi lebih jauh dari model OpenGL klasik. DSA adalah satu perubahan kecil yang diperlukan sekitar 10+ tahun yang lalu (awalnya dijanjikan sebagai bagian dari OpenGL 3.0), mirip dengan apa yang D3D10 lakukan. Banyak perubahan perangkat keras di atas membutuhkan jauh lebih dari sekadar DSA untuk menjaga agar OpenGL tetap relevan, itulah sebabnya mengapa ekstensi yang lebih besar yang secara drastis mengubah model OpenGL tersedia . Lalu ada API GLnext baru lengkap ditambah D3D12, Mantel, Logam, dll. Tidak satu pun yang membuat abstraksi mesin keadaan ketinggalan zaman.


Terima kasih atas jawabannya. Jadi tampaknya sebelum beberapa titik state-machine (non-DSA) menang, tetapi pada titik tertentu sesuatu telah berubah dan sekarang DSA menguntungkan. Bisakah Anda menjelaskan apa yang telah berubah?
Kromster

@KromStern: melakukan yang terbaik. Jika Anda membutuhkan lebih banyak detail, seseorang yang lebih berpengetahuan daripada saya harus menyediakannya.
Sean Middleditch

@KromStern Saya telah melihat (dari penelitian terbatas saya ke dalam sejarah) openGL bergerak ke draw drawings CPU side per frame; daftar tampilan (untuk apa nilainya), glDrawArrays (menggambar dalam satu panggilan), VBO (unggah ke GPU sekali), VAO (mengikat buffer ke atribut sekali), objek penyangga seragam (mengatur seragam dalam sekali jalan). Ada lagi yang saya rindukan, saya yakin.
ratchet freak

@ scratchetfreak: cukup lucu, kami bergerak ke arah lain sekarang. API / ekstensi modern difokuskan pada peningkatan panggilan draw kami per frame, sebagian besar dengan menghapus semua status yang harus ditetapkan / dikirim per panggilan draw dan membuat panggilan draw sedikit lebih dari "masukkan perintah draw ke dalam antrian perintah" terhadap big mengatur keadaan statis dan sumber daya tanpa batas. Oooh, tanpa batas, aku lupa menyebutkan bagian itu dalam jawabanku.
Sean Middleditch

@SeanMiddleditch Saya seharusnya mengatur panggilan per frame.
ratchet freak

1

Tinjauan umum membenarkannya dengan:

Maksud ekstensi ini adalah untuk membuatnya lebih efisien bagi perpustakaan untuk menghindari pemilih yang terganggu dan keadaan terkunci. Ekstensi ini juga memungkinkan penggunaan perintah yang lebih efisien dengan menghilangkan kebutuhan akan perintah pembaruan pemilih.

Saya pikir "lebih efisien" di sini merujuk pada overhead pembukuan yang kurang untuk penulis perpustakaan, dan menghasilkan kinerja yang lebih tinggi. Dengan API saat ini, untuk menjadi "berperilaku baik" Anda perlu menanyakan keadaan, menyembunyikannya, mengubah keadaan untuk melakukan apa yang Anda butuhkan, lalu mengembalikan keadaan semula.

Suka

oldState = glGet()
glBind()
glDoThings...
glSet(oldState)  // restore, in case anyone needs it just as they left it

Agaknya, perangkat keras yang lebih lama dapat dibuat lebih berkinerja dengan API yang mengubah keadaan secara eksplisit; itu ritual yang cukup aneh. Ekstensi ini menyiratkan (dan lihat saja daftar kepengarangan!) Yang menghindari pengambilan, set, dan pemulihan tarian sekarang lebih merupakan kemenangan kinerja pada perangkat keras saat ini, bahkan dengan parameter tambahan pada setiap panggilan.


"perlu kueri / simpanan / ubah / pulihkan" - bagaimana ini lebih baik dengan DSA?
Kromster

kode pseudo ..added untuk ditampilkan. Dengan DSA, semua itu tidak perlu. Agaknya perangkat keras saat ini tidak benar-benar membutuhkan keadaan "mengikat", cukup akses semua itu sesuai kebutuhan.
david van

Rantai get/bind/do/setjarang digunakan, karena 'Dapatkan' sangat lambat. Biasanya aplikasi harus mempertahankan replika variabel, jadi hanya berlaku untuk adil bind/do. Tapi saya mengerti maksudnya.
Kromster

2
@ krom dapatkan dari status driver bisa cepat, beberapa status gettable tidak memiliki bisnis di GPU sehingga hanya bisa didapat dari RAM yang cepat.
ratchet freak
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.