Gerçekten bir grafik API kullanmam gerekir mi?


22

Bir 3D oyunda donanım ivmesi almak için grafik API'leri kullanmak gerekli midir? OpenGL, DirectX , CUDA, OpenCL veya başka bir şey gibi grafik kartı API'larına bağımlılıktan kaçınmak mümkün olabilir ?

Oyunum için kendi grafik API'mi veya kitaplığımı yapabilir miyim? Zor olsa bile, 3D uygulamamın bağımsız olarak grafik sürücüsüyle iletişim kurması ve GPU'daki her şeyi oluşturması teorik olarak mümkün mü?


30
CUDA ve OpenCL, grafik API’leri değildir.
Soapy,

4
"Grafik sürücüsüyle bağımsız olarak iletişim kurun" için her zaman bir API'ye ihtiyacınız var!
Josef

21
Hayır, grafikler için bir API'ye ihtiyacınız yok, sürücüye doğrudan erişebilir, orada durmaz bile, istediğiniz sürücüyü doğrudan konuşmak için kendi sürücünüzü yazabilirsiniz. Fakat bir sonraki sorunuz çok daha önemli: "Grafik API kullanmalı mıyım?", Evet, evet yapmalısınız.
Kevin,

5
Siz insanlar bir API'nin de bir noktada yapıldığını biliyor musunuz? Sürücü, bir API'nin uygulayabildiği ve kullanması kolay API çağrıları yapan dış aramalara maruz kalmaktadır.
Kevin,

3
OpenGL'yi desteklemeyen bir grafik kartı (veya bu noktada işletim sistemi) yoktur. Kelimenin tam anlamıyla her şeyi üzerinde çalışır, bu nedenle kullanmak istememesinin tek nedeni "uyumluluk" için ise, tamamen temelsiz bir sorundur.
Sandal Ayak

Yanıtlar:


39

Cevapların çoğunun önemli bir noktayı kaçırdığını düşünüyorum: donanıma doğrudan erişen, ancak modern işletim sistemlerinde uygulamalar yazabilirsiniz . Bu sadece bir zaman problemi değil, "başka seçeneğin yok" problemi.

Windows, Linux, OSX, vb. Hepsi isteğe bağlı uygulamalara doğrudan donanım erişimini yasaklar. Güvenlik nedeniyle bu önemlidir: Herhangi bir rastgele uygulamanın rastgele GPU hafızasını okuyabilmesini istemezsiniz, aynı nedenle herhangi bir rastgele uygulamanın sistem hafızasını okuyabilmesini istemezsiniz. Banka hesabınızın çerçevesi veya GPU hafızasında yaşamayan şeyler gibi şeyler. Bu şeylerin izole edilmesini, korunmasını ve erişiminizin işletim sisteminiz tarafından kontrol edilmesini istiyorsunuz.

Yalnızca sürücüler çoğu donanıma doğrudan konuşabilir ve sürücüyle konuşmanın tek yolu OS'nin ifşa ettiği HAL ve her sürücünün özel ve uyumsuz arayüzüdür. Bu sürücü arayüzü sadece her satıcı için farklı olmakla kalmayacak, hatta sürücünün versiyonları arasında bile farklılık gösterecek ve tüketici uygulamasında doğrudan arayüzle konuşmayı imkansız hale getirecek. Bu katmanlar genellikle bir uygulamanın kendilerine erişme özelliğini daha da kısıtlayan erişim kontrolleriyle kaplıdır.

Yani hayır, tabii ki sadece DOS gibi güvensiz işletim sistemlerini hedeflemediğiniz sürece ve doğrudan modern tüketici işletim sistemlerinde bir oyun için tek seçenek, DirectX, OpenGL veya Vulkan.


Kudos, tartışmaya güzel bir ekleme. Her gün yeni bir şey öğreniyorsun.
Mühendis,

1
Donanım erişimi için bir çekirdek modülü yazma tercihinizi kısıtlayan nedir? Ayrıca, tek bir kartı (makinenizdeki kart) hedefliyorsanız uyumluluk sorunları ortadan kalkar; Yine de yapılması gereken önemsiz bir şey olmaktan uzak; ancak tersine mühendislik uygulanmış sürücüler verilen uygulanabilir alan içerisinde; özellikle, kartla ne yapmak istediğinizi sınırlı bir kapsamınız varsa.
Joel Bosveld

1
Birçok işletim sisteminde sürücü imzalama, modülünüzü dağıtmayı zorlaştırır. Her türlü işletim sistemi sürücüsünü ve yerel hackleri kesinlikle oluşturabilirsiniz, ancak oyununuzu çok geniş bir şekilde dağıtamayacaksınız, ki bu da OP'nin gerçek bir oyun yapmayı istediği gibi arzulanan bir yanı olduğunu düşünmüyor. teknoloji demosu. : p
Sean Middleditch

27

Pratik olarak gerekli, evet. Gerekli, çünkü orada yıllarca farklı donanım yapılandırmaları için temel olarak sürücü kodunu yazmayı harcamak istemiyorsanız, tüm popüler işletim sistemleri ve donanım için GPU satıcıları tarafından yazılmış mevcut sürücülere karşı birleşik bir API kullanmanız gerekir.

Tek gerçekçi alternatif, 3B hızlandırma kullanmamanız ve bunun yerine, C gibi gerçekten taşınabilir bir şeyde yazılmış olması koşuluyla, hemen hemen her sistem / cihazda çalışabilecek yazılım oluşturma için gitmenizdir. Küçük oyunlar için iyi bir şey ... SDL gibi bir şey bu amaç için uygun ... orada başkaları da var. Ancak bu, doğal 3D yeteneklerinden yoksundur, bu yüzden onları kendiniz inşa etmeniz gerekebilir ... ki bu önemsiz bir iş değildir.

Ayrıca, CPU oluşturma işleminin verimsiz olduğunu ve GPU'lara göre daha düşük bir performans sergilediğini unutmayın.


11
OP'nin avantajlarından faydalanmak için: yazılım sunumu da oldukça düşük bir performansa sahiptir. Bu, daha basit oyunlar için kare hızı açısından önemli olmasa da, birçok müşterinin çektiği pil ömründeki azalmayı takdir edeceğinden şüpheliyim çünkü yazılım oluşturma işlemcileri işlemcilerini olması gerekenden çok daha aktif tutuyor.
Chris Hayes

1
İyi nokta, @ChrisHayes ... eklemek için düzenlenmiş. Birileri bazen böyle şeylerin açık olduğunu varsayar.
Mühendis,

1
İlk paragrafınız teknik olarak bir API kullanmanın gerekli olmadığını söylüyor gibi görünüyor . Elbette, belki de birden fazla kişinin sunması gereken muazzam miktarda programcı zamanı kazandırır, ancak bu gerekli değildir . Beklediğim gibi, grafik kartı sürücüsü ve üst seviye yazılım kütüphaneleri arasında bir tür şifreleme doğrulaması olmadıkça.
David Z

5
@DavidZ Size bir sürücü yazdınız mı? Teknik özelliklere sahip değilken, kart üreticisinin kullandığı mühendisler bile sürücüyü geliştirmek için aylar harcadıklarında karmaşık donanım ile etkileşime girmenin nasıl bir şey olduğunu biliyor musunuz? Şimdi, birçok mimarla desteklemeniz gerektiğiyle çarpın. Tabii ki, "Everest'i ekipmansız tırmanmak imkansız" dersem, elbette yapabileceğiniz bir şans var, ama gerçekten çok minicik bir şans ... neden birileri tartışıyor ki?
Mühendis,

1
OP'ye neden; tartışmak istediklerini sorun ;-); ancak özellikle düzenlemeden sonra, istedikleri bu oldukça açık.
David Z

8

OpenGL veya DirectX gibi API'ler kısmen işletim sistemi tarafından uygulanır ve kısmen grafik sürücüsünün kendisi tarafından uygulanır.

Bu, modern GPU'ların yeteneklerini kullanan kendi düşük seviyeli API'nizi oluşturmak istediğinizde, aslında kendi grafik sürücünüzü yazmanız gerekir. Sürücünüzün tüm genel grafik kartlarıyla çalıştığından emin olmak, özellikle satıcılar spesifikasyonlarına çok açık olmadığından, oldukça zor olacaktır.


6

PC'nizi MS-DOS'a açın. Ardından, PC Oyun Programcıları Ansiklopedisi kopyanızı kullanarak, doğrudan kartın VESA kayıt defterlerine ve video belleğine yazabilirsiniz . Bunu yapmak için 20 yıl önce yazdığım ve yazılımın ilkel 3D'sini yapmak için hala kodum var.

Alternatif olarak, sadece DirectX kullanabilirsiniz; bu gerçekten ince bir soyutlama katmanıdır ve ayrıca doğrudan video arabelleklerine yazmanıza ve ekrana geçmenize olanak tanır.

Kendi video donanımınızı oluşturmanın aşırı bir yaklaşımı da var .


4

Diğer cevaplar ana sorunuza oldukça iyi cevap veriyor: teknik olarak mümkün, ancak pratikte amacınız müşteri tabanınızı genişletmekse, tam tersini yapıyorsunuzdur. Desteklemeniz gereken binlerce farklı donanım ve işletim sistemi yapılandırmasını destekleme konusunda çok fazla çalışma boşa harcanırken.

Ancak, bu, belirli bir API'ye% 100 bağımlı olmanız gerektiği anlamına gelmez. Kendi soyutlama katmanınızı her zaman kodlayabilir ve daha sonra daha belirli uygulamaları (örneğin bir DirectX uygulaması, bir OpenGL uygulaması, ...) takas edebilir ve çıkarabilirsiniz.

O zaman bile, muhtemelen buna değmez. Sadece amaçlarınız için yeterince işe yarayan bir şey seçin ve bununla bitirin. Sen bir indie oyun kurucususun - kendini minuta değil oyuna sokan şeylere odaklanman gerekiyor. Sadece oyunu yap!


4

Özetle: Teorik olarak yapabilirsiniz, ancak bu mümkün değildir ve hiçbir avantaj elde edemezsiniz. Sınırlamalar API'ler bugün her gün daha az hale geldi, siz CUDA ve OpenCL ve gölgelendiricilere sahipsiniz. Yani tam kontrole sahip olmak artık bir problem değil.


Fuller açıklaması:

Buna cevap vermek sıkıcı bir evet . Asıl soru neden ?

Bunu neden öğrenme amaçlarından başka yapmak istediğinizi hayal etmiyorum. Bir noktada, geliştiricilerin CPU oluşturma uygulamaları ile bir şey yapma özgürlüğü olduğunu, herkesin kendi API'si olduğunu, “boru hattı” ndaki her şeyin kontrolünde olduğunu bilmelisiniz. Sabit boru hattı ve GPU'ların tanıtılmasıyla herkes değişti.

GPU'larla "daha iyi" performans elde edersiniz, ancak çok fazla özgürlük kaybedersiniz. Grafik geliştiricileri bu özgürlüğü geri almak için bastırıyor. Bu nedenle, her gün daha fazla özelleştirme boru hattı. Sürücülere dokunmadan hemen hemen her şeyi CUDA / OpenCL ve hatta gölgelendiricileri kullanarak yapabilirsiniz.


1

Donanımla konuşmak istiyorsun. Donanımla konuşmak için bir yol kullanmanız gerekir. Bu şekilde, donanımın arayüzüdür. OpenGL, DirectX, CUDA, OpenCL ve her neyse.

Daha düşük bir seviyeye ulaşırsanız sadece daha düşük seviyeli bir arayüz kullanıyorsunuzdur, ancak yine de bir arayüz kullanıyorsunuz, sadece daha yüksek seviyedeki kadar farklı kartlarla çalışmayan bir arayüz kullanıyorsunuz.


1

Almak 3D Donanım HızlandırmaGeleneksel bir API kullanmadan , grafik sürücünün işlevselliğini çoğaltmak için kendi kodunuzu yazmanız gerekir. Öyleyse bunu yapmanın en iyi yolu, grafik sürücüsünün koduna bakmaktır.

NVIDIA kartlar için açık kaynaklı nouveau projesine bakmalısınız . Burada harika kaynaklar var. .

Diğer grafik kartı markaları için benzer projeler ve belgeler bulabilirsiniz.

Diğer yanıtlarda da belirtildiği gibi, modern işletim sistemlerinin çoğu, kullanıcı alanı programlarının donanıma doğrudan erişmesini engelleyeceğinden kodunuzu yazmanız ve onu bir işletim sistemi sürücüsü olarak yüklemeniz gerekeceğini unutmayın. Alternatif olarak, bu tür kısıtlamaları olmayan FreeDOS işletim sistemini kullanabilir ve (teoride) donanıma doğrudan erişmenize izin vermeli ve 3D donanımı hızlandırılmış grafikler veren normal bir program yazmanıza izin vermelisiniz. Unutmayın ki, mevcut bir açık kaynak kodlu grafik sürücüsünden kod kullanmak bile, bunun çok büyük miktarda önemsiz bir iş olacağını (ve bildiğim kadarıyla hiçbir zaman yapılmadığını ve çeşitli nedenlerle, aslında olmayabileceğini) unutmayın. teknik olarak mümkün).


1

DirectX veya OpenGl'den kurtulmak bağımlılıkları ortadan kaldırmaz, daha fazlasını sunar. Diğer cevaplar, doğrudan grafik donanımıyla (en azından mümkün değil) konuşmanın neden mümkün olamayacağına dair pek çok iyi nokta içeriyor, ancak ilk cevabım şöyle olacaktır: Aslında, tüm ortak 3B'yi özetleyen bir kitaplık yazdıysanız tek bir API içine grafik donanımları etkin bir şekilde DirectX / OpenGl. Bir oyun yazmak için kodunuzu kullanıyor olsaydınız, yeni kütüphanenizi yeni bir bağımlılık olarak eklerdiniz, tıpkı şimdi bir bağımlılık olarak DirectX / OpenGl'de olduğu gibi.

DirectX veya OpenGl kullanarak bağımlılıklarınız temel olarak "Bu kod, belirli komutların farklı grafik kartlarında nasıl çalıştırılacağını açıklayan kodu sağlamak için bir kütüphaneye bağlıdır" demiştir. Eğer böyle bir kütüphane olmadan devam ederseniz, “Bu kod, oyunu kurduğum donanımla aynı şekilde çalışan grafik donanımına bağlıdır” bağımlılığını ortaya koyarsınız.

OpenGl veya DirectX gibi soyutlamalar, donanım üreticilerinin ortak bir kod tabanına yol açan kendi kodlarını (sürücülerini) sağlamalarına izin verir; bu nedenle oyunların, oyun yazıldığında bile mevcut olmayan bir donanım üzerinde çalışması daha muhtemeldir.


0

Her şeyden önce, CUDA ve OpenCL grafik uygulamaları değildir. Onlar hesap apis.

Kendi grafik api'nizi yazarken problem çok karmaşık olmasıdır. Donanıma doğrudan arabirim kurabilirsiniz, ancak eğer X CPU, X GPU, X ram ve X işletim sistemi olan bir sistemde çalışıyorsa, Y CPU, Y GPU, vb. Olan bir sistemde çalışacağının garantisi yoktur. İyi bir nokta DirectX'in çekirdek modu sürücülerle çalışmasıdır. Çekirdeğe köklenir. Ayrıca, grafik apis GPU'ları destekleyecek şekilde oluşturulmamıştır. GPU'lar (ve sürücüleri) onları desteklemek için oluşturulmuştur. Dolayısıyla, kendi işletim sisteminizi oluşturmadıkça ve sağlanan X86 VGA kesintilerini kullanmadıkça bir grafik api oluşturamazsınız. Ancak yine de GPU ile düzgün bir şekilde bağlantı kuramayacaksınız ve düşük çözünürlükte kalacaksınız.

Anladığım kadarıyla her şeyi kendiniz oluşturmak ve bir motor ya da bunun gibi bir şey kullanmak istemiyorsunuz. Ancak kendi grafik api'nizi yapmanız kullanıcı için bir sakınca yaratır.


0

Kendi sürücünüzü ve API'nizi yazabilirsiniz, sizi ve yeteneğinizi ve bilgi seviyenizi durduracak hiçbir şey yoktur. Başka bir şey olmazsa, iyi bir öğrenme deneyimi olmazsa, asıl sorun şu ki, önceden çok fazla grafik deneyimi yaşamadan, o zaman harika bir programcı olsanız bile, muhtemelen yapmanız gerekenleri kaybedeceksiniz ... ya da hatta başlamak.

Yine de kendiniz yaptığınız arayüz, sizin için sürekli ardarda güncellenen bir şeyden daha kolay ve daha kararlı olacak. Bu yüzden, daha fazla insanın bu rotaya gitmemesi biraz şaşırtıcı, ama gerçekte az sayıda insanın teknik zekası var ve hiç kimse bunun sonunda nasıl yapılacağını öğrenmek için sonunda yıllarca birisine ödemek istemiyor, muhtemelen şirketten ayrıldılar ve şirkette kaldılar. Standardizasyon konusunda kendileri için iyi olan şey, çalışanları çok daha masraflı hale getirmesi ve riskleri azaltmasıdır.

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.