Dlaczego mamy frameworki graficzne, takie jak OpenGL i DirectX, skoro gry mogą rysować piksele bezpośrednio?

16

Gry i inne aplikacje intensywnie korzystające z grafiki korzystają ze struktur takich jak OpenGL i DirectX. Wymagają także funkcji takich jak moduł cieniujący piksele i DX12.

Ale dlaczego potrzebowalibyśmy tych wszystkich struktur i funkcji GPU, skoro mogliśmy po prostu rysować wszystko piksel po pikselu?

Po pierwsze, gra musiałaby się kompilować w taki sposób, aby była rysowana piksel po pikselu. Prawdopodobnie sprawi to, że gra będzie wykonywalna, ale czy będzie szybsza i działała na dowolnym 32-bitowym kolorowym GPU (nawet starym)?

Wiem, że pierwsze gry 3D rysowano piksel po pikselu, ale dlaczego teraz tego nie robią?

Suici Doga
źródło
Ogólnie rzecz biorąc, wykonanie jednej operacji na wielu rzeczach jest bardziej wydajne i łatwiejsze do przemyślenia niż wykonanie każdej z nich indywidualnie.
user541686,
2
Ponieważ każda gra musiałaby zostać przepisana dla każdej karty graficznej. Chyba że nie użyją karty graficznej, ale wtedy będą wolni.
user253751
Myślę, że firmy GPU muszą stworzyć własne sterowniki DirectX
Suici Doga
1
„Ale dlaczego potrzebowalibyśmy tych wszystkich struktur i funkcji GPU, skoro mogliśmy po prostu rysować wszystko piksel po pikselu?” to jak to miało miejsce w dobrych ol”dni. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake i większość innych gier z końca lat 90. używały czystego renderowania programowego (Quake oferował renderer OpenGL jako opcję).
el.pescado
1
@MatthewRock Nie jesteś pomocny. Z pewnością możesz połączyć system operacyjny z grą w kontenerze dokowanym i dystrybuować kontener. W ten sposób użytkownik nie musi instalować zależności bibliotek dla swojej dystrybucji.
Navin

Odpowiedzi:

23

Szybkość jest najczęstszym powodem, dla którego tak się nie dzieje. W rzeczywistości możesz robić to, co proponujesz, jeśli stworzysz własny system operacyjny, będzie on po prostu bardzo powolny ze względów architektonicznych. Zatem założenie, że jest szybszy, jest nieco błędne. Nawet gdyby był szybszy, byłby mniej wydajny pod względem rozwoju (np. Zwiększenie prędkości o 1% przy 10-krotnym nakładzie pracy).

Kopiowanie danych z procesora na kartę graficzną jest stosunkowo powolną operacją. Im mniej kopiujesz, tym większa może być prędkość aktualizacji. Idealnie byłoby, gdybyś miał większość danych na GPU i aktualizował tylko małe porcje danych. Istnieje świat różnic między kopiowaniem ponad 320 x 200 pikseli w porównaniu z 1920 x 1200 lub więcej. Zobacz, ile pikseli trzeba zaktualizować, rośnie kwadratowo wraz ze wzrostem boków.

Przykład: taniej jest powiedzieć GPU, aby przesunął obraz o 10 pikseli w prawo, niż ręcznie skopiować piksele do pamięci wideo w różnych lokalizacjach.

Dlaczego musisz przejść przez API? Po prostu dlatego, że to nie twój system. System operacyjny nie zezwala na robienie wszystkiego, co chcesz ze względów bezpieczeństwa. Po drugie, ponieważ system operacyjny musi wyodrębnić sprzęt, nawet system operacyjny rozmawia ze sterownikiem przez jakiś abstrakcyjny system, API, jeśli wolisz.

W rzeczywistości oceniłbym prawdopodobieństwo, że twój system byłby szybszy, gdybyś sam wykonał całą pracę, blisko zera. To trochę jak porównywanie C i asemblera. Pewnie, że możesz pisać asemblery, ale kompilatory są obecnie dość inteligentne i optymalizują się coraz lepiej. Trudno być lepszym ręcznie, nawet jeśli możesz, Twoja produktywność spadnie.

PS: Interfejs API nie uniemożliwia wykonania tej aktualizacji, tak jak zrobiły to stare gry. To wszystko jest po prostu nieefektywne. Nie z powodu umysłu API, ale dlatego, że jest to nieefektywny okres.

PPS: Właśnie dlatego wprowadzają Vulkan.

joojaa
źródło
6
See the number of pixels you need to update grows exponetially when the sides grow.Myślę, że kwadratowo.
Cthulhu,
„Kopiowanie danych z procesora na kartę graficzną jest stosunkowo powolną operacją”. To prawda, ale bez znaczenia. Kopiowanie ponad kilku milionów pikseli przy 60 fps jest łatwe do osiągnięcia nawet przy skromnych łączach PCI-E (wymagałoby to tylko kilkuset megabajtów na sekundę.)
Coxy
2
@ pjc50 To nie jest źle, ale także nie do końca prawda. Procesor graficzny specjalizuje się w równoległym uruchamianiu pojedynczego programu (zwykle modułu cieniującego) na dużej ilości danych. Musisz więc wykonać te same operacje na wielu danych, aby faktycznie wykorzystać moc obliczeniową GPU. Jeśli twój program nie działa, lepiej uruchom go na CPU.
Nero,
2
x2)2)x
1
Mówisz o kopiowaniu i przenoszeniu, ale ważniejsze jest faktyczne generowanie obrazu. Musisz określić, który obiekt będzie widoczny, w którym momencie, jak zostanie oświetlony, jakie będą skutki dymu itp. Itd. Procesory graficzne są wysoce zoptymalizowane, aby wykonywać te operacje szybko i równolegle. Interfejsy API ułatwiają wyrażanie typowych operacji.
IMil
15

pracować na dowolnym 32-bitowym kolorowym GPU (nawet starym)?

Trochę historii: oto jak powstawały gry na PC, dopóki akceleratory graficzne nie stały się dostępne w połowie lat 90-tych. Rzeczywiście działał na całym sprzęcie, ponieważ sprzęt nie robił wiele.

Akcelerator graficzny umożliwia rysowanie pikseli znacznie szybciej niż procesor, przy użyciu specjalistycznego sprzętu i równoległości. Akcelerator zawiera wiele rdzeni procesora. Komputer stacjonarny będzie miał 1-8 rdzeni w zależności od wieku. Moja karta graficzna GTX970Ti ma 1664 (tysiąc sześćset sześćdziesiąt cztery!) Rdzeni. To oczywiście bije na PC szybszą prędkość.

Jednak akceleratory nie są znormalizowane i często zawierają dziwne sztuczki architektury komputerowej w celu osiągnięcia ich prędkości. Aby napisać grę, która nie jest dostosowana do konkretnej marki i modelu karty, musi istnieć interfejs API. I do tego służą języki DirectX, GL i shader. W rzeczywistości pisanie programów cieniujących jest najbliższe pisaniu programu, który rysuje piksele bezpośrednio - po prostu karta uruchomi dla Ciebie tysiąc kopii tego programu równolegle, po jednym na piksel.

pjc50
źródło
APU mojego laptopa ma 256 rdzeni cieniujących @ 686 MHZ, a mój tablet 192.
Suici Doga
Hej, Titan X ma 5760 rdzeni.
Daniel
@Daniel Czy są jakieś gry, w których Titan X osiąga <30 klatek na sekundę przy ultra high. Titan X jest bardzo potężny
Suici Doga
Ummm, jeden z nich, być może: maximumpc.com/10-most-graphically-demanding-pc-games
Daniel
@Daniel Twórcy tych gier muszą mieć około 2-4 kart Titan X :)
Suici Doga
14

Wystarczy dodać do odpowiedzi joojaa za rzeczy wciąż rysowane piksel po pikselu. Po prostu generujesz piksele za pomocą shadera / asemblera / rasterizera wierzchołków, a następnie teksturujesz i oświetlasz je za pomocą shadera fragmentów. Wszystko to zostało zrobione w oprogramowaniu w latach 90., kiedy twoja karta graficzna była niczym więcej niż blitterem i buforem klatek, ale była powolna jak diabli. Stąd wynalazek nowoczesnych GPU.

Matematyka rysowania, która się dzieje, jest w zasadzie taka sama jak w czasach Dooma, ale teraz działa na setkach / tysiącach jednostek ALU shaderów, a nie na kilku rdzeniach procesora. Interfejsy API odwzorowują zasadniczo ten sam zestaw instrukcji GPU za kulisami. Są tylko po to, aby powstrzymać Cię przed koniecznością napisania tonu zgrabnego zestawu GPU na wielu platformach dostawców.

Russ
źródło