Platformlar arası düşük seviye grafik API'sı


11

Bir sistem soyutlaması oluştururken, platformun farklı API'lerin ortak bir arayüz tarafından en düşük düzeyde gizlenmesi daha mantıklıdır.

Farklı modern (sabit fonksiyon boru hattı olmadan) yerel grafik API'lerini hesaba katarak: OpenGLES 2.0+, OpengGL 3.0+, DirectX 10.0+, Xbox DirectX 9, LibGCM

Bir tanesi hepsinin üstüne oturmak için vatansız bir düşük seviye grafik API oluşturmak olsaydı, onu mümkün olduğunca ince ve hızlı hale getirmenin en iyi yolu ne olurdu?


API'nın vatansız olması şartı ilginçtir. Örneğin, OpenGL durumludur ve bence sadece çok daha yüksek seviyedeyse mantıklı olan vatansız bir API, böylece her biri için aynı matrisleri itmek ve patlatmak zorunda kalmamak oluşturduğu yüzey.
SpoonMeiser

Yararsız durum değişikliklerinden kaçınmak, cihaza göndermeden önce render aramalarını durumlarına göre sıralamak gibi daha yüksek bir düzeyde de uygulanabilir. Ve durumu yalnızca geçerli olandan farklıysa ayarlayabilirsiniz.
NocturnDragon

Bu vatansız değil. Belki yanılıyorum, ama vatansız olduğunu düşündüğümde düşündüğüm şey, her çağrının daha önceki çağrılara bağlı olmadığı bir API. Bu, normalde bir yerde halde depolanacak herhangi bir bilginin, bu bilgiye ihtiyaç duyan her çağrıda geçirilmesi gerektiği anlamına gelir. Örneğin, OpenGL için bunlar yığın, aydınlatma, z-tamponlama ve normalleştirme seçeneklerindeki matrislerdir.
SpoonMeiser

Evet, ihtiyaç duyacağınız her çekiliş için, mesh verileri, karıştırma durumu, bağlanacak dokular, örnekleme durumları vb. Ya da belki yorumunu yanlış okuyorum ..
NocturnDragon

Yanıtlar:


6

Benim açımdan mantıklı olan en düşük seviye, render / vb, render yüzeyleri, dokular, gölgelendiriciler, durum blokları vb.

Buradaki sorun, API'ya bağlı olarak bunların bazılarının farklı formatlarda olması gerektiğidir - işte burada biraz zorlaşır. Etrafındaki en kolay yol, ilgili API için statik kaynakları önceden işlemektir. Dinamik olanlar için, onları oluşturmak için sadece gölgelendiricileri kullanın - bu, yerel formatlarda kalmayı oldukça basit hale getirir.

Daha sonra daha yüksek seviyede yaptığınız tek şey, ekli kaynaklara sahip boru hatları kurmak ve bunları GPU'ya teslim etmektir. Özellikle donanıma özgü hilelerden faydalanırsanız, her şeyin bu şekilde güzel bir şekilde çıkarılamayacağını göreceksiniz. Ama iyi bir başlangıç.

(Sidenote: platforma özgü hileleri özel bir kaynak olarak ele alırsanız, tüm konsepti oldukça ileriye götürebilirsiniz.)

Yani bir bakıma iki şey yaratacaksınız: Bir donanım kaynak yöneticisi, ayrıca bu kaynakların bir DAG'ını ayarlamak için bir araç seti.


Platforma özgü şeylere kaynak muamelesi yapmayı hiç düşünmemiştim. Çok iyi bir fikir gibi geliyor! Teşekkürler.
NocturnDragon

10

Kapsam dahil etmek istediğiniz geniş API yelpazesi göz önüne alındığında, tipik sarma yaklaşımının verimsiz olması ve belirli kavramları değişen derecelerde destekleyebilecek veya desteklemeyebilecek diğer birkaç API arasında API kavramlarını eşleme konusunda zorluk çekmeye eğilimli olması muhtemeldir.

Sonuç olarak, en mantıklı yaklaşım özellik merkezli bir API oluşturmak olacaktır . Bu yaklaşım, API kullanıcısının mevcut tüm işlevleri kullanmasını engellese de, her arka ucun uygulanmasını büyük ölçüde basitleştirir ve aksi halde mümkün olmayacak arka uca özgü optimizasyonları mümkün kılar.

Ayrıca API kullanıcısı için desteklenmeyen işlevsellik yönetimini büyük ölçüde basitleştirir; artık X işlevinin var olup olmadığını kontrol etmek ve hangi özelliklerin etkilendiğini belirlemek zorunda değiller, bunun yerine sadece geçerli yapılandırma ile desteklenip desteklenmediğini görmek için özelliğin kendisini sorgulamak zorundadırlar. Özellikler için kısmi veya sınırlı modları destekleseniz bile, sağlanan bağlam yönetmeyi çok daha kolay hale getirir.

Durum bilgisi olmayan ( gönderim tabanlı olarak da bilinir ) oluşturucu oluşturma açısından, işleme için komutları paketlemek ve göndermek için genellikle 64bit anahtar kullanılır. Bu noktadan sonra, komutların nasıl yürütüleceği ve hangi özellikleri ve yetenekleri desteklemek istediğinize bağlı olarak hangi bilgilerin sunulacağı konusunda büyük bir esneklik vardır.


Bu aslında iyi bir fikir. Ve yaratmaya çalıştığım tasarımın bir parçası, ama aklımdaki bu özellikleri ortak bir düşük seviye API'nin üzerine uygulamaktı. Ancak, bazı özellikler için bazı daha özel durumlar için yerel API'nın derinliklerine inmeniz gerekebilir.
Dragon

Fikrin bir kısmı, ortak bir düşük seviye API oluşturmaktan ve en düşük ortak payda yaklaşımıyla sarma ile uğraşmaktan kaçınmaktır. Soyutlama seviyesini bir çentik yukarı taşıyarak, özellik setini biraz kısıtlarsınız, ancak her platformdan yararlanma yeteneği kazanırsınız. Ara sıra daha derin erişim ihtiyacını karşılamak için platform başlıklarını ve bazı dahili yardımcıları ortaya koyan bir başlık sağlamayı tercih ederim; sürümü sürüme bölebilir, ancak ihtiyacınız varsa oradadır.
Jason Kozak

1

Başlangıç ​​olarak, her API farklı şeyler yapar, bu nedenle yukarıdaki API'lerin tümünü kaydırmanın zor olacağını söylemeden geçmelidir. Bununla birlikte, bazen bunu yapmak gerekir: bir noktada bir oyunun ne kadar zor olduğuna bakılmaksızın birden fazla platformda çalışması gerekir.

Bunu yapmanın en iyi yolunun, temeldeki API'lerin tümünde uygulanabilen işlevselliği bulmak ve bu ve sadece bu olduğunu düşünüyorum. Çok platformlu bir oyun geliştiriyorsanız, her API'nın desteklediği her türlü belirsiz işlevselliği uygulamazsınız, yalnızca ihtiyacınız olanı uygularsınız. Bu, API'yi küçük ve hızlı tutmaya da yardımcı olur.

Her farklı API'nin uygulamasının çıktıya paketlenmesini önlemek için derleme, platform nötr başlık dosyaları ve platforma özgü kod dosyalarıyla yapılmalıdır. Daha sonra, hedef platforma özgü kod dosyası API'yı küçük tutan tek dosya olacaktır.



-4

SDL kütüphanesine veya Allegro'ya bakmak isteyebilirsiniz . Her ikisi de grafiklerinizi orada oluşturabilmeniz için onları bir OpenGL bağlamına bağlamanın bir yolu olan düşük seviyeli, son derece taşınabilir oyun kütüphaneleridir. SDL, Loki Games tarafından 2000'lerden Linux'a bazı popüler oyunları taşımak için kullanılma şöhretine sahiptir ve Allegro'nun çok fazla zamanı vardır ve amatör oyun geliştiricileri topluluğu vardır.


4
Bu soruya gerçekten cevap vermiyor, hem OpenGL'yi hem de DirectX'i sarmanın çok mümkün olduğunu belirtmiyoruz (bkz. Ogre3D, Irrlicht, vb.).
Jason Kozak

Oynadığınız oyunları düşünün. Kaç tanesinde DirectX veya OpenGL kullanma seçenekleri var? Bu iki kütüphanenin birini destekleyebilmesi için sarmalayıcılar oluşturulur. Sınırlı bir hayal gücünüz var. :-P
Ricket

OpenGL veya DirectX ile grafik oluşturmak isteyip istemediğinizi seçmenize izin veren bazı oyunlar olduğunu biliyorum, ancak soru bir platformlar arası API ile ilgili, bu yüzden cevabın yeterli olduğunu düşünüyorum, ilk paragrafı düzenleyeceğim, rağmen.
chiguire

1
soru platformlar arası vatansız düşük seviye API ile ilgilidir. SDL ve Allegro'nun bununla hiçbir ilgisi yok.
NocturnDragon

@NocturnDragon - soru başlığı biraz yanıltıcı. İlk bakışta sorunun mevcut API seçimleriyle ilgili olmasını bekledim ve bu yanıtlayıcının da yaptığını varsayıyorum.
a_m0d
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.