Perché abbiamo framework grafici come OpenGL e DirectX, quando i giochi possono semplicemente disegnare pixel direttamente?


16

I giochi e altre applicazioni graficamente intense usano framework come OpenGL e DirectX. Inoltre richiedono funzionalità come pixel shader e DX12.

Ma perché dovremmo avere bisogno di tutti questi framework e funzionalità GPU quando potremmo semplicemente disegnare tutto pixel per pixel?

Innanzitutto, il gioco dovrebbe essere compilato in modo da essere disegnato pixel per pixel. Questo probabilmente renderà il gioco eseguibile grande, ma sarà più veloce e funzionerà su qualsiasi GPU a colori a 32 bit (anche quelle vecchie)?

So che i primi giochi 3D sono stati disegnati pixel per pixel, ma perché non lo stanno facendo ora?


In generale, fare un'operazione su molte cose è più efficiente e più facile da pensare che farlo su ogni cosa individualmente.
user541686

2
Perché ogni gioco dovrebbe essere riscritto per ogni scheda grafica. A meno che non usassero la scheda grafica, ma sarebbero stati lenti.
user253751

Penso che le aziende GPU debbano creare i propri driver DirectX
Suici Doga il

1
"Ma perché dovremmo avere bisogno di tutti questi framework e funzionalità GPU quando potremmo semplicemente disegnare tutto pixel per pixel?" ecco come è stato fatto nel buon vecchio giorni. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake e molti altri giochi della fine degli anni '90 utilizzavano il rendering di software puro (Quake offriva il renderizzatore OpenGL come opzione).
el.pescado,

1
@MatthewRock Non stai aiutando. Puoi certamente raggruppare un sistema operativo con un gioco all'interno di un contenitore docker e distribuire il contenitore. In questo modo, l'utente non deve installare le dipendenze della libreria per la sua distribuzione.
Navin,

Risposte:


23

La velocità è il motivo più comune per cui ciò non viene fatto. In effetti puoi fare ciò che proponi, se crei il tuo sistema operativo, sarà molto lento per motivi architettonici. Quindi il presupposto che sia più veloce è un po 'imperfetto. Anche se sarebbe più veloce, sarebbe meno efficiente in termini di sviluppo (come aumento dell'1% della velocità per 10 volte il lavoro).

La copia dei dati dalla CPU alla scheda grafica è un'operazione relativamente lenta. Meno copi, maggiore sarà la velocità di aggiornamento. Quindi idealmente avresti la maggior parte dei dati sulla tua GPU e aggiornerai solo piccoli blocchi di dati. Esiste un mondo di differenza tra la copia di oltre 320x200 pixel rispetto a 1920x1200 o più. Vedi il numero di pixel che devi aggiornare cresce quadraticamente quando i lati crescono.

Esempio: è più economico dire alla GPU di spostare l'immagine di 10 pixel a destra piuttosto che copiarli manualmente nella memoria video in diverse posizioni.

Perché devi passare attraverso un'API? Semplicemente perché non è il tuo sistema. Il sistema operativo non può consentirti di fare ciò che desideri per motivi di sicurezza. In secondo luogo, poiché il sistema operativo deve estrarre l'hardware, anche il sistema operativo sta parlando al driver attraverso un sistema astratto, un'API se lo desideri.

In effetti valuterei la probabilità che il tuo sistema sia più veloce, se tu facessi tutto il lavoro da solo, vicino allo zero. È un po 'come confrontare C e assembly. Sicuramente puoi scrivere assembly, ma i compilatori sono piuttosto intelligenti in questi giorni e ottimizzano sempre meglio. È difficile migliorare manualmente, anche se è possibile che la produttività diminuisca.

PS: un'API non rende impossibile eseguire questo aggiornamento proprio come facevano i vecchi giochi. È solo inefficiente, tutto qui. Non a causa della mente dell'API ma perché è un periodo inefficiente.

PPS: ecco perché stanno lanciando Vulkan.


6
See the number of pixels you need to update grows exponetially when the sides grow.Quadraticamente, penso.
Cthulhu,

"La copia dei dati dalla CPU alla scheda grafica è un'operazione relativamente lenta." Questo è vero, ma irrilevante. Copiare più di qualche milione di pixel a 60 fps è facilmente realizzabile su collegamenti PCI-E anche modesti (richiederebbe solo poche centinaia di megabyte al secondo.)
Coxy

2
@ pjc50 Non è sbagliato, ma non è esattamente vero. Una GPU è specializzata per eseguire un singolo programma (di solito uno shader) in parallelo su una grande quantità di dati. Pertanto, è necessario eseguire le stesse operazioni su molti dati per utilizzare effettivamente la potenza di elaborazione di una GPU. In caso contrario, è meglio eseguire il programma sulla CPU.
Nero,

2
x22X

1
Parli di copia e spostamento, ma ciò che è più importante è la generazione effettiva dell'immagine. Devi determinare quale oggetto sarà visibile in quale punto, come verrà illuminato, quali saranno gli effetti del fumo, ecc. Ecc. Le GPU sono altamente ottimizzate per eseguire queste operazioni velocemente e in parallelo. Le API facilitano l'espressione di operazioni comuni.
Imil

15

funziona su qualsiasi GPU a colori a 32 bit (anche quelle vecchie)?

Un po 'di storia qui: ecco come sono stati fatti i giochi su PC fino a quando gli acceleratori grafici non sono diventati disponibili a metà degli anni '90. Funzionava davvero su tutto l'hardware, perché l'hardware non stava facendo molto.

Un acceleratore grafico consente il disegno di pixel notevolmente più veloce di una CPU, utilizzando hardware specializzato e parallelismo. L'acceleratore contiene un numero di core del processore. Un PC desktop avrà tra 1-8 core a seconda dell'età. La mia scheda grafica GTX970Ti ha 1664 core (milleseicentosessantaquattro!). Questo ovviamente batte il PC per la velocità pura di molto.

Tuttavia, gli acceleratori non sono standardizzati e spesso includono strani trucchi di architettura del computer per raggiungere la loro velocità. Per poter scrivere un gioco non personalizzato per una marca e un modello specifici della carta, deve esistere un'API. Ed è per questo che vengono utilizzati DirectX, GL e le lingue shader. In effetti, scrivere shader è la cosa più vicina alla scrittura di un programma che disegna direttamente i pixel - è solo che la scheda eseguirà migliaia di copie di quel programma per te in parallelo, una per pixel.


L'APU del mio laptop ha 256 shader core @ 686MHZ mentre il mio tablet ha 192.
Suici Doga

Ehi, Titan X ha 5760 core.
Daniel,

@Daniel Ci sono giochi in cui il Titan X va <30fps ad altissimo. Il Titan X è molto potente
Suici Doga,


@Daniel Gli sviluppatori di questi giochi devono aver bisogno di circa 2-4 carte Titan X :)
Suici Doga,

14

Solo per aggiungere alla risposta di joojaa , le cose vengono ancora disegnate pixel per pixel. Stai solo generando i pixel usando uno shader / assemblatore / rasterizzatore di vertici, quindi texturing e illuminandoli usando uno shader di frammenti. Tutto ciò è stato fatto nel software negli anni '90 quando la tua scheda video non era molto più di un blitter e un frame buffer, ma era lento come l'inferno. Da qui l'invenzione delle moderne GPU.

La matematica del disegno che sta accadendo è sostanzialmente la stessa di quando era nei tempi di Doom, ma ora funziona su centinaia / migliaia di ALU shader piuttosto che su una manciata di core della CPU. Le API sono associate allo stesso set di istruzioni GPU dietro le quinte. Sono lì solo per impedirti di scrivere un sacco di nodosi assemblaggi di GPU su più piattaforme di fornitori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.