OpenGL'nin doğrudan durum erişim mekanizmasının avantajı nedir?


11

Opengl.org'da OpenGL 4.5 Doğrudan Durum Erişimi (DSA) hakkında okudum ve doğru olup olmadığımı bilmiyorum.

Eski yolun daha az verimli olduğu ima ediliyor:

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

yeni yoldan:

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

Görünüşe göre, şimdi her glSetbirinin glBind(something)içine dahil edilmesi gerekiyor ve eğer OpenGL hala bir devlet makinesi ise, bir single'a uygulanan akışlı değişikliklerden yararlanamıyor something.

Lütfen yeni DSA'nın nedenini ve avantajlarını açıklayın.

Yanıtlar:


21

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.


Cevap için teşekkürler. Yani bir nokta devlet makinesi (DSA olmayan) bir kazanmadan önce, bir noktada bir şey değişti ve şimdi DSA avantajlı görünüyor. Değişenlere biraz ışık tutabilir misin?
Kromster

@KromStern: elimden geleni yaptım. Daha fazla ayrıntıya ihtiyacınız varsa, bunu sağlamak zorunda olduğumdan daha bilgili biri.
Sean Middleditch

@KromStern (Geçmişteki sınırlı araştırmamdan) openGL'nin daha az ve daha az çekiliş çağrısına geçtiğini gördüm. görüntüleme listeleri (değerinde oldukları şey için), glDrawArrays (bir çağrıda çizim), VBO'lar (bir kez GPU'ya yükleme), VAO'lar (tamponları bir kez özniteliklere bağlama), düzgün tampon nesnesi (tek seferde üniformaları ayarlayın). Kaçırdığımdan daha fazlası var, eminim.
cırcır ucube

@ratchetfreak: yeterince komik, şimdi başka yöne hareket ediyoruz. Modern API'lar / uzantılar, çoğunlukla çizim çağrısı başına ayarlanması / gönderilmesi gereken tüm durumları kaldırarak ve çizim çağrılarını büyük bir sayıya karşı "komut kuyruğuna beraberlik komutu ekle" statik durum ve bağsız kaynaklar kümesi. Oooh, bağsız, cevabımda bu kısımdan bahsetmeyi bile unuttum.
Sean Middleditch

@SeanMiddleditch Çerçeve başına arama ayarlamalıydım.
mandal ucube

1

Genel bakış bunu şu şekilde gerekçelendirir:

Bu uzantının amacı kütüphanelerin rahatsız edici seçici ve kilitli durumdan kaçınmasını daha verimli hale getirmektir. Uzantı, seçici güncelleme komutlarına olan ihtiyacı ortadan kaldırarak daha verimli komut kullanımına da izin verir.

Bence burada "daha verimli" hem kütüphane yazarları için daha az defter tutma yükü hem de sonuçta daha yüksek performans anlamına geliyor. Mevcut API ile "iyi davranmak" için, durumu sorgulamanız, saklamanız, ihtiyacınız olanı yapmak için durumu değiştirmeniz ve ardından orijinal durumu geri yüklemeniz gerekir.

Sevmek

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

Muhtemelen, eski donanım açık durum değiştiren API ile daha performanslı hale getirilebilir; aksi takdirde oldukça garip bir ritüel. Bu uzantı, getirme, ayarlama, geri yükleme dansından kaçınmanın artık her donanımdaki ek parametre ile bile mevcut donanımda bir performans kazancı olduğunu ima eder (ve sadece yazarlık listesine bakın!).


"sorgulama / stash / change / restore" - DSA ile nasıl daha iyi?
Kromster

.. göstermek için eklenen sözde kod. DSA ile bunların hiçbiri gerekli değildir. Muhtemelen mevcut donanım gerçekten "bağlama" durumuna ihtiyaç duymaz, sadece gerektiğinde hepsine erişebilir.
david van brink

Zincir get/bind/do/setnadiren kullanılır, çünkü 'Get' çok yavaştır. Genellikle uygulamalar yine de değişkenlerin kopyasını korumak zorundadır, bu yüzden sadece keser bind/do. Ama konuyu anlıyorum.
Kromster

2
@krom sürücü durumundan almak hızlı olabilir, bazı gettable durumunun GPU'da hiçbir işi yoktur, bu yüzden hızlı olan RAM'den alınabilir.
cırcır ucube
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.