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?
Odpowiedzi:
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.
źródło
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.
źródło
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.
źródło
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 .
źródło
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ę!
źródło
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.
źródło
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.
źródło
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).
źródło
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.
źródło
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.
źródło
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.
źródło