Görünüşe göre şimdi her glSet içinde glBind (bir şey) içermelidir
Tam olarak değil. Aşağıdaki birkaç paragrafta açıklandığı gibi, bunun tersi de geçerlidir.
Doğru olsa bile, istemci uygulamasından GL sunucusuna (aka sürücü) GL komutlarının normal bir işlev çağrısına kıyasla çok fazla yükü olduğunu unutmayın. DSA işlevlerinin yalnızca varolan işlevlerin etrafındaki sarmalayıcılar olduğunu varsaysak bile, bunlar GL sunucusunun içinde yaşayan ve dolayısıyla (biraz) daha az ek yüke sahip olabilen sarmalayıcılardır.
OpenGL'nin hala bir devlet makinesi olması durumunda, tek bir şeye uygulanan akışlı değişikliklerden yararlanamaz.
GPU'lar devlet makinesi değildir. GL durum makine arayüzü, DSA benzeri sürücü dahili bileşenlerini saran bir öykünmedir, tersi değil.
Bir sarma katmanının (GL sunucusuna aşırı sayıda çağrı gerektiren bir katman) kaldırılması, küçük bir katman olsa bile açıkça bir kazançtır.
Devlet makinesi yaklaşımı aynı zamanda birden çok iş parçacığı ile uğraşırken bir ton anlam ifade etmemektedir; GL bu kullanım durumunda hala korkunç, ancak sürücüler genellikle sahnelerin arkasında iş parçacıkları kullanıyor ve bir durum makinesi, işlerin güvenilir bir şekilde çalışması için çok sayıda iplik senkronizasyonu veya gerçekten süslü paralel algoritmalar / yapılar gerektiriyor.
DSA uzantısı, durum değişiklikleri açısından çalışmasını ifade etmeye devam ediyor, çünkü sonuçta, tamamen yeni bir API değil, mevcut bir eyalet tabanlı belgenin uzantısıdır, bu nedenle mevcut GL spesifikasyonuna bağlanmaya hazır olması gerekiyordu belgenin dili ve terminolojisi. Mevcut dil modern grafik donanım API'sı olarak işine oldukça uygun olsa bile.
Lütfen yeni DSA'nın nedenini ve avantajlarını açıklayın.
En büyük mantık, eski yolun bir acı olmasıydı. Her biri GL durumunu değiştirebilecek veya güvenebilecek kütüphaneleri birlikte oluşturmayı çok zorlaştırdı. Derin işlemsel durum yönetimi kökleri nedeniyle GL API'yi nesne yönelimli veya işlevsel bir tarzda verimli bir şekilde sarmayı zorlaştırdı; Direct3D'den bu soyut OpenGL.
İkincisi, daha önce açıklandığı gibi, prosedürel durum-makine API yükü idi.
Üçüncüsü, DSA işlevleri uygun olduğunda daha iyi verimlilik sağlayan eski API'lerden anlambilimi değiştirdi. Daha önce değiştirilebilen şeyler, örneğin GL sunucusundan çok sayıda kitap tutma kodunu kaldıran değişmez hale getirildi. GL sunucusunun değiştirilebilir nesnelerle uğraşması gerekmediğinde, uygulamanın çağrıları donanıma gönderilebilir veya daha erken (veya daha paralel moda) doğrulanabilir.
-
Ek gerekçelendirme ve açıklama EXT_direct_state_access uzantı belirtiminde verilmiştir .
-
API tasarımı ile ilgili donanım değişiklikleri oldukça fazladır.
OpenGL'nin 1991'e kadar uzandığını unutmayın. Hedef donanım tüketici sınıfı grafik kartları (bunlar mevcut değildi) değil, büyük CAD iş istasyonları ve benzerleridir. O dönemin donanımı bugünkünden çok farklı performans zarflarına sahipti; çoklu iş parçacığı daha nadirdi, bellek veriyolları ve CPU'ların hız boşluğu daha azdı ve GPU sabit işlevli üçgen oluşturmadan çok daha fazlasını yaptı.
Giderek daha fazla sabit işlev özelliği eklendi. Her biri kendi durum parçalarına ihtiyaç duyan çeşitli aydınlatma modelleri, doku modları vb. Eklendi. Basit devlet tabanlı yaklaşım, bir avuç eyaletiniz olduğunda işe yaradı. Giderek daha fazla durum eklendikçe, API dikişlerde patlamaya başladı. API daha garip hale geldi, ancak birçok durum anahtarına dayandığı için donanım modlarından çok uzak değildi.
Sonra programlanabilir donanım geldi. Donanım gittikçe daha programlanabilir hale geldi, bu noktada donanım küçük bir durumu, bazı kullanıcı tarafından sağlanan programları ve çok sayıda arabelleği destekliyor. Önceki döneme ait tüm bu durumun taklit edilmesi gerekiyordu, tıpkı o dönemin tüm sabit işlev özelliklerinin sürücüler tarafından taklit edildiği gibi.
Donanım da gittikçe paralel hale geldi. Bu, grafik durumu değişikliklerini çok pahalı yapan diğer donanım yeniden tasarımlarını gerektiriyordu. Donanım, değişmez devletin büyük bloklarında çalışır. Bu değişiklikler nedeniyle, sürücü kullanıcının hemen ayarladığı durumun her bir bitini uygulayamadı, ancak değişiklikleri otomatik olarak toplu hale getirmek ve gerektiğinde bunları örtük olarak uygulamak zorunda kaldı.
Modern donanım, klasik OpenGL modelinden daha da fazla çalışır. DSA, D3D10'un yaptığı gibi, yaklaşık 10 yıl önce gerekli olan küçük bir değişikliktir (başlangıçta OpenGL 3.0'ın bir parçası olarak vaat edildi). Yukarıdaki donanım değişikliklerinin çoğunun OpenGL'yi alakalı tutmak için DSA'dan çok daha fazlasına ihtiyacı vardır, bu nedenle OpenGL modelini büyük ölçüde değiştiren daha büyük uzantılar mevcuttur . Sonra tamamen yeni GLnext API artı D3D12, Manto, Metal, vb.