Czy naprawdę muszę korzystać z graficznego interfejsu API?


22

Czy konieczne jest użycie graficznych interfejsów API, aby uzyskać przyspieszenie sprzętowe w grze 3D? W jakim stopniu można uwolnić się od zależności od interfejsów API kart graficznych, takich jak OpenGL, DirectX , CUDA, OpenCL lub cokolwiek innego?

Czy mogę stworzyć własny interfejs graficzny API lub bibliotekę dla mojej gry? Nawet jeśli jest to trudne, to teoretycznie możliwe jest, aby moja aplikacja 3D niezależnie skontaktowała się ze sterownikiem graficznym i renderowała wszystko na GPU?


30
CUDA i OpenCL nie są graficznymi interfejsami API.
Soapy

4
Aby „niezależnie skontaktować się ze sterownikiem karty graficznej”, zawsze potrzebujesz API!
Josef

21
Nie, nie potrzebujesz interfejsu API do grafiki, możesz uzyskać bezpośredni dostęp do sterownika, to nawet się nie kończy, możesz napisać własny sterownik, aby bezpośrednio porozmawiać ze sprzętem, jeśli kiedykolwiek tego chcesz. Ale twoje następne pytanie jest o wiele ważniejsze: „Czy powinienem użyć graficznego interfejsu API?”, Tak, tak, powinieneś.
Kevin

5
Czy ludzie zdają sobie sprawę, że interfejs API jest również tworzony w pewnym momencie? Sterownik jest narażony na wywołania zewnętrzne, które API implementuje i otacza przyjemnymi, łatwymi w użyciu wywołaniami API.
Kevin

3
Nie ma karty graficznej (lub systemu operacyjnego w tym momencie), która nie obsługuje OpenGL. Działa dosłownie na wszystkim, więc jeśli jedynym powodem, dla którego nie chcesz go używać, jest „kompatybilność”, jest to całkowicie bezpodstawna obawa.
Sandalfoot

Odpowiedzi:


39

Myślę, że w wielu odpowiedziach brakuje ważnego punktu: możesz pisać aplikacje, które uzyskują bezpośredni dostęp do sprzętu, ale nie w nowoczesnych systemach operacyjnych . To nie tylko problem czasowy, ale problem „nie masz wyboru”.

Windows, Linux, OSX itp. Zakazują bezpośredniego dostępu sprzętowego do dowolnych aplikacji. Jest to ważne ze względów bezpieczeństwa: nie chcesz, aby żadna przypadkowa aplikacja mogła odczytywać dowolną pamięć GPU z tego samego powodu, dla którego żadna przypadkowa aplikacja nie może odczytać pamięci systemowej. Rzeczy takie jak bufor ramki dla twojego konta bankowego lub coś, co nie jest zapisane w pamięci GPU. Chcesz, aby te elementy były izolowane i chronione, a dostęp kontrolowany przez system operacyjny.

Tylko sterowniki mogą komunikować się bezpośrednio z większością sprzętu, a jedynym sposobem na komunikację ze sterownikiem jest udostępniona warstwa systemu operacyjnego HAL oraz zastrzeżony i niekompatybilny interfejs każdego sterownika. Ten interfejs sterownika będzie nie tylko różny dla każdego dostawcy, ale nawet będzie różnić się między wersjami samego sterownika, co uniemożliwi niemal bezpośrednią komunikację z interfejsem w aplikacji konsumenckiej. Warstwy te są często objęte kontrolą dostępu, która dodatkowo ogranicza możliwość dostępu do nich przez aplikację.

Więc nie, twoja gra nie może po prostu bezpośrednio korzystać ze sprzętu, chyba że atakujesz tylko niepewne systemy operacyjne, takie jak DOS, a jedyną możliwą opcją dla gry na nowoczesnych konsumenckich systemach operacyjnych jest ukierunkowanie na publiczny interfejs API, taki jak DirectX, OpenGL lub Vulkan.


Kudos, dobry dodatek do dyskusji. Każdego dnia uczysz się czegoś nowego.
Inżynier

1
Co ogranicza wybór pisania jądra w celu uzyskania dostępu do sprzętu? Ponadto, jeśli celujesz w jedną kartę (tę w twoim komputerze), problemy ze zgodnością znikają; choć nadal nie jest to trywialne zajęcie; ale w dziedzinie wykonalnej, biorąc pod uwagę sterowniki inżynierii wstecznej; zwłaszcza jeśli masz ograniczony zakres tego, co chcesz zrobić z kartą.
Joel Bosveld

1
Podpisywanie sterowników w wielu systemach operacyjnych utrudnia dystrybucję modułu. Z pewnością możesz zbudować lokalnie wszelkiego rodzaju sterowniki i hacki systemu operacyjnego, ale nie będziesz w stanie bardzo szeroko rozpowszechniać swojej gry, co, jak zakładałem, jest pożądanym aspektem, gdy OP poprosił o stworzenie rzeczywistej gry, a nie bezcelowe demo techniczne. : p
Sean Middleditch

27

Praktycznie jest to konieczne, tak. Jest to konieczne, ponieważ jeśli nie chcesz spędzić lat na pisaniu kodu sterownika dla wielu różnych konfiguracji sprzętowych, musisz użyć interfejsu API, który łączy się z istniejącymi sterownikami napisanymi przez dostawców GPU dla wszystkich popularnych systemów operacyjnych i sprzętu.

Jedyną realistyczną alternatywą jest to, że nie używasz akceleracji 3D, a zamiast tego wybierasz renderowanie oprogramowania, które, pod warunkiem, że jest napisane w czymś naprawdę przenośnym, takim jak C, będzie mogło działać na prawie każdym systemie / urządzeniu. To jest w porządku dla mniejszych gier ... coś takiego jak SDL nadaje się do tego celu ... są też inne. Brakuje jednak nieodłącznych możliwości 3D, więc trzeba by je zbudować sam… co nie jest trywialnym zadaniem.

Pamiętaj także, że renderowanie procesora jest nieefektywne i ma niską wydajność w porównaniu do procesorów graficznych.


11
Wykorzystanie korzyści PO: renderowanie oprogramowania ma również znacznie gorszą wydajność. Chociaż w przypadku prostszych gier może to nie mieć znaczenia, wątpię, aby wielu klientów doceniło obniżenie żywotności baterii, ponieważ renderowanie oprogramowania powoduje, że procesor jest o wiele bardziej aktywny niż w innym przypadku.
Chris Hayes

1
Dobra uwaga, @ChrisHayes ... edytowane, aby dodać. Czasami zakłada się, że takie rzeczy są oczywiste.
Inżynier

1
Wydaje się, że twój pierwszy ustęp mówi, że technicznie to nie konieczne użycie API. Oczywiście, oszczędza to ogromną ilość czasu programisty, być może więcej niż jedna osoba ma do zaoferowania, ale nie jest to konieczne . Tak jak się spodziewałam, chyba że między sterownikiem karty graficznej a bibliotekami oprogramowania wyższego poziomu odbywa się jakaś weryfikacja kryptograficzna.
David Z

5
@DavidZ Czy napisałeś już sterownik? Czy wiesz, jak to jest łączyć się ze złożonym sprzętem, gdy nie masz nawet specyfikacji, a nawet inżynierowie zatrudnieni przez producenta karty zajęli wiele miesięcy na opracowanie sterownika? Teraz pomnóż to przez wiele architektur, które musisz wspierać. Jeśli powiem: „Nie można wspiąć się na Everest bez wyposażenia”, oczywiście jest szansa, że ​​możesz, ale tak naprawdę jest to tak niewielka szansa… dlaczego ktoś miałby o to dyskutować?
Inżynier

1
Zapytaj PO, dlaczego chcą się spierać ;-), ale zwłaszcza po edycji, jest całkiem jasne, że tego właśnie chcą.
David Z

8

Interfejsy API, takie jak OpenGL lub DirectX, są częściowo implementowane przez system operacyjny i częściowo implementowane przez sam sterownik graficzny.

Oznacza to, że jeśli chcesz stworzyć własny interfejs API niskiego poziomu, który wykorzystuje możliwości współczesnych procesorów graficznych, zasadniczo musisz napisać własny sterownik grafiki. Sprawdzenie, czy sterownik współpracuje ze wszystkimi popularnymi kartami graficznymi, byłoby sporym wyzwaniem, zwłaszcza że dostawcy często nie są zbyt otwarci na specyfikacje.


6

Uruchom komputer w MS-DOS. Następnie, korzystając z kopii Encyklopedii programistów gier komputerowych , możesz pisać bezpośrednio do rejestrów VESA karty i do pamięci wideo. Nadal mam kod, który napisałem 20 lat temu, aby to zrobić i renderować podstawowe oprogramowanie 3D.

Alternatywnie możesz po prostu użyć DirectX; to naprawdę cienka warstwa abstrakcji, a także pozwala pisać bezpośrednio w buforach wideo, a następnie zamieniać je na ekranie.

Istnieje również ekstremalne podejście do budowania własnego sprzętu wideo .


4

Inne odpowiedzi dość dobrze odpowiadają na twoje główne pytanie: technicznie jest to możliwe, ale w praktyce, jeśli Twoim celem jest poszerzenie bazy klientów, robisz odwrotnie. Marnując ogrom pracy na obsługę tysięcy różnych konfiguracji sprzętu i systemu operacyjnego, które musisz obsługiwać.

Nie oznacza to jednak, że musisz być w 100% zależny od jednego konkretnego interfejsu API. Zawsze możesz zakodować własną warstwę abstrakcji, a następnie zamienić bardziej szczegółowe implementacje (np. Implementację DirectX, implementację OpenGL, ...).

Nawet wtedy prawdopodobnie nie warto. Po prostu wybierz coś, co działa wystarczająco dobrze dla twoich celów i gotowe. Jesteś niezależnym twórcą gier - musisz skupić się na rzeczach tworzących grę, a nie na szczegółach. Po prostu stwórz grę!


4

Podsumowując: Teoretycznie możesz, ale jest to niewykonalne i nie uzyskasz żadnej przewagi. Ograniczenia Interfejsy API stają się dziś coraz mniej każdego dnia, masz CUDA i OpenCL oraz shadery. Tak więc pełna kontrola nie stanowi już problemu.


Pełniejsze wyjaśnienie:

Odpowiedź jest nudna tak . Prawdziwe pytanie brzmi: dlaczego ?

Nie wyobrażam sobie, dlaczego miałbyś to robić inaczej niż do celów edukacyjnych. Musisz wiedzieć, że w pewnym momencie programiści mieli swobodę robienia czegokolwiek ze swoimi implementacjami renderowania procesora, wszyscy mieli własne API, kontrolowali wszystko w „potoku”. Wraz z wprowadzeniem stałego potoku i procesorów graficznych wszyscy zmienili się ..

Dzięki procesorom graficznym zyskujesz „lepszą” wydajność, ale tracisz dużo swobody. Twórcy grafiki starają się odzyskać tę swobodę. W związku z tym codzienny proces dostosowywania jest większy. Możesz zrobić prawie wszystko za pomocą CUDA / OpenCL, a nawet shaderów, bez dotykania sterowników.


1

Chcesz porozmawiać ze sprzętem. Musisz użyć sposobu na rozmowę ze sprzętem. W ten sposób jest interfejs do sprzętu. Właśnie takie są OpenGL, DirectX, CUDA, OpenCL i cokolwiek innego.

Jeśli przejdziesz na niższy poziom, po prostu używasz interfejsu niższego poziomu, ale nadal używasz interfejsu, tylko takiego, który nie działa z tyloma różnymi kartami, co wyższy poziom.


1

Aby uzyskać przyspieszenie sprzętowe 3D bez korzystania z tradycyjnego interfejsu API, w zasadzie musisz napisać własny kod, aby powielić funkcjonalność sterownika karty graficznej. Najlepszym sposobem, aby dowiedzieć się, jak to zrobić, jest sprawdzenie kodu sterownika karty graficznej.

W przypadku kart NVIDIA powinieneś przyjrzeć się nowemu projektowi open source . Mają kolekcję wielkich zasobów tutaj .

W przypadku kart graficznych innych marek można znaleźć podobne projekty i dokumentację.

Należy pamiętać, że jak wspomniano w innych odpowiedziach, większość współczesnych systemów operacyjnych uniemożliwi bezpośrednie programy sprzętowe użytkownika dostępowi do sprzętu, dlatego należy napisać kod i zainstalować go jako sterownik systemu operacyjnego. Alternatywnie możesz użyć systemu operacyjnego FreeDOS, który nie ma takich ograniczeń, i powinien (teoretycznie) pozwolić ci na bezpośredni dostęp do sprzętu i pozwolić na napisanie zwykłego programu, który renderuje grafikę 3D przyspieszaną sprzętowo. Zauważ, że nawet wykorzystanie kodu z istniejącego sterownika grafiki open source byłoby ogromną ilością nietrywialnej pracy (i, o ile wiem, nigdy nie zostało wykonane, a z różnych powodów może nie być technicznie możliwe).


1

Pozbycie się DirectX lub OpenGl nie usunęłoby zależności, wprowadziłoby ich więcej. Inne odpowiedzi już zawierają kilka dobrych argumentów, dlaczego bezpośrednia rozmowa ze sprzętem graficznym może być niemożliwa (przynajmniej nie jest to wykonalne), ale moja pierwsza odpowiedź brzmiałaby: jeśli faktycznie napisałeś bibliotekę, która streszcza wszystkie typowe 3d graficzne oprogramowanie sprzętowe w jeden interfejs API, który efektywnie przepisałeś DirectX / OpenGl. Gdybyś użył swojego kodu do napisania gry, dodałbyś nową bibliotekę jako nową zależność, tak jak teraz masz DirectX / OpenGl jako zależność.

Korzystając z DirectX lub OpenGl, twoje zależności w zasadzie mówią: „Ten kod zależy od biblioteki dostarczającej kod wyjaśniający, jak uruchamiać określone polecenia na różnych kartach graficznych”. Gdybyś nie miał takiej biblioteki, wprowadziłbyś zależność: „Ten kod zależy od sprzętu graficznego, który zachowuje się dokładnie tak samo, jak sprzęt istniejący podczas tworzenia gry”.

Abstrakcje takie jak OpenGl lub DirectX pozwalają producentom sprzętu na dostarczenie własnego kodu (sterowników), który prowadzi do wspólnej bazy kodu, więc gry są bardziej prawdopodobne na sprzęcie, który nawet nie istniał, gdy gra została napisana.


0

Przede wszystkim CUDA i OpenCL nie są aplikacjami graficznymi. Są obliczeniowymi apis.

Problem z pisaniem własnego interfejsu API polega na tym, że jest on bardzo złożony. Możesz bezpośrednio łączyć się ze sprzętem, ale nie ma gwarancji, że jeśli działa on na systemie z X CPU, X GPU, X ilością RAM i systemem operacyjnym X, będzie działał na systemie z Y CPU, Y GPU itp. Dobrym punktem jest to, że DirectX działa ze sterownikami trybu jądra. Jest zakorzeniony w jądrze. Ponadto interfejsy graficzne nie są przystosowane do obsługi układów GPU. Procesory graficzne (i ich sterowniki) są zbudowane w celu ich obsługi. Tak więc prawie nie można zbudować interfejsu graficznego, jeśli nie zbuduje się własnego systemu operacyjnego i nie zastosuje przerwań VGA pod warunkiem x86. Ale nadal nie będziesz w stanie poprawnie połączyć się z GPU i utkniesz w niskiej rozdzielczości.

Rozumiem, że chcesz zbudować wszystko sam, a nie używać silnika ani czegoś takiego. Ale tworzenie własnego interfejsu graficznego spowodowałoby niedogodności dla użytkownika.


0

Możesz napisać własny sterownik i interfejs API, nic Cię nie powstrzyma, oprócz twoich umiejętności i poziomów wiedzy. Jeśli nic innego nie byłoby dobrym doświadczeniem w nauce, prawdziwym problemem jest to, że bez wielu wcześniejszych doświadczeń graficznych, nawet jeśli jesteś świetnym programistą, prawdopodobnie nie będziesz w stanie zrobić tego, co musisz zrobić ... a nawet rozpocząć.

Jednak interfejs, który sam stworzysz, będzie łatwiejszy w użyciu i bardziej stabilny niż coś ciągle aktualizowanego za twoimi plecami. Dlatego trochę mnie zaskakuje, że więcej osób nie idzie tą drogą, ale w rzeczywistości niewiele osób ma wiedzę techniczną i nikt nie chce płacić komuś przez całe lata, aby nauczyć się, jak to wszystko robić, a potem być może opuszczają firmę i pozostawiają ich na lodzie. Zaletą dla nich jest to, że normalizacja sprawia, że ​​pracownicy są o wiele bardziej wydatkowi i zmniejszają ryzyko.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.