¿Por qué tenemos marcos gráficos como OpenGL y DirectX, cuando los juegos solo pueden dibujar píxeles directamente?

16

Los juegos y otras aplicaciones gráficamente intensivas usan marcos como OpenGL y DirectX. También requieren características como pixel shader y DX12.

Pero, ¿por qué necesitaríamos todos estos marcos y funciones de GPU cuando podríamos dibujar todo píxel por píxel?

Primero, el juego tendría que compilarse de alguna manera para que se dibuje píxel por píxel. Es probable que esto haga que el juego sea ejecutable en grande, pero ¿será más rápido y funcionará en cualquier GPU de color de 32 bits (incluso las antiguas)?

Sé que los primeros juegos 3D fueron dibujados píxel por píxel, pero ¿por qué no lo están haciendo ahora?

Suici Doga
fuente
En general, hacer una operación en muchas cosas es más eficiente y más fácil de pensar que hacerlo en cada cosa individualmente.
user541686
2
Porque cada juego debería reescribirse para cada tarjeta gráfica. A menos que no usaran la tarjeta gráfica, pero serían lentos.
user253751
Creo que las compañías de GPU tienen que crear sus propios controladores DirectX
Suici Doga
1
"Pero, ¿por qué necesitaríamos todos estos marcos y funciones de GPU cuando podríamos dibujar todo píxel por píxel?" eso es cómo se ha hecho en los buenos días del ol. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake y la mayoría de los otros juegos de finales de los '90 utilizaron renderizado de software puro (Quake ofreció el renderizador OpenGL como una opción).
el.pescado
1
@MatthewRock No estás siendo útil. Ciertamente puede agrupar un sistema operativo con un juego dentro de un contenedor acoplable y distribuir el contenedor. De esa manera, el usuario no necesita instalar dependencias de biblioteca para su distribución.
Navin

Respuestas:

23

La velocidad es la razón más común por la que esto no se hace. De hecho, puede hacer lo que propone, si crea su propio sistema operativo, será muy lento por razones arquitectónicas. Entonces, la suposición de que es más rápido es un poco defectuosa. Incluso si fuera más rápido, sería menos eficiente en términos de desarrollo (como un aumento de velocidad del 1% por 10 veces el trabajo).

Copiar los datos desde la CPU a la tarjeta gráfica es una operación relativamente lenta. Cuanto menos copie, más rápida puede ser su velocidad de actualización. Por lo tanto, lo ideal sería tener la mayoría de los datos en su GPU y solo actualizar pequeños fragmentos de datos. Existe una gran diferencia entre copiar más de 320x200 píxeles en comparación con 1920x1200 o más. Vea que la cantidad de píxeles que necesita actualizar aumenta de forma cuadrática cuando crecen los lados.

Ejemplo: es más barato decirle a la GPU que mueva la imagen 10 píxeles a la derecha que copiar los píxeles manualmente a la memoria de video en diferentes ubicaciones.

¿Por qué tienes que pasar por una API? Simplemente porque no es tu sistema. El sistema operativo no puede permitirle hacer lo que quiera por razones de seguridad. En segundo lugar, debido a que el sistema operativo necesita abstraer el hardware, incluso el sistema operativo está hablando con el controlador a través de algún sistema abstraído, una API si lo desea.

De hecho, calificaría la probabilidad de que su sistema sea más rápido, si solo hiciera todo el trabajo usted mismo, cerca de casi cero. Es un poco como comparar C y ensamblaje. Claro que puede escribir ensamblaje, pero los compiladores son bastante inteligentes en estos días y optimizan mejor y mejor todo el tiempo. Es difícil ser mejor manualmente, incluso si puede, su productividad se reducirá por los desagües.

PD: Una API no hace que sea imposible hacer esta actualización como lo hicieron los juegos antiguos. Es ineficiente, eso es todo. No por la mente API sino porque es un período ineficiente.

PPS: Es por eso que están implementando Vulkan.

joojaa
fuente
66
See the number of pixels you need to update grows exponetially when the sides grow.Cuadráticamente, creo.
Cthulhu
"Copiar los datos desde la CPU a la tarjeta gráfica es una operación relativamente lenta". Esto es cierto, pero irrelevante. Copiando unos pocos millones de píxeles a 60 fps es fácilmente alcanzables incluso más modestos enlaces PCI-E (sólo requeriría unos pocos cientos de megabytes por segundo.)
Coxy
2
@ pjc50 Eso no está mal, pero tampoco es exactamente cierto. Una GPU está especializada para ejecutar un solo programa (generalmente un sombreador) en paralelo en una gran cantidad de datos. Por lo tanto, debe realizar las mismas operaciones en muchos datos para utilizar realmente la potencia de cálculo de una GPU. Si su programa no lo hace, será mejor que lo ejecute en la CPU.
Nero
2
X22X
1
Hablas de copiar y mover, pero lo más importante es la generación real de imágenes. Debe determinar qué objeto será visible en qué punto, cómo se iluminará, cuáles serán los efectos del humo, etc. Las GPU están altamente optimizadas para realizar estas operaciones de forma rápida y en paralelo. Las API facilitan la expresión de operaciones comunes.
IMil
15

funciona en cualquier GPU de color de 32 bits (incluso las antiguas)?

Un poco de historia aquí: así es como se hicieron los juegos en PC hasta que los aceleradores gráficos comenzaron a estar disponibles a mediados de los 90. De hecho, funcionó en todo el hardware, porque el hardware no estaba haciendo mucho.

Un acelerador gráfico permite dibujar píxeles considerablemente más rápido que una CPU, mediante el uso de hardware especializado y paralelismo. El acelerador contiene varios núcleos de procesador. Una PC de escritorio tendrá entre 1 y 8 núcleos, dependiendo de la edad. Mi tarjeta gráfica GTX970Ti tiene 1664 (¡mil seiscientos sesenta y cuatro!) Núcleos. Obviamente, esto supera a la PC en cuanto a velocidad bruta en gran medida.

Sin embargo, los aceleradores no están estandarizados y, a menudo, incluyen trucos extraños de arquitectura informática para alcanzar su velocidad. Para escribir un juego que no esté personalizado para una marca y modelo específicos de la tarjeta, debe existir una API. Y para eso se utilizan DirectX, GL y los lenguajes de sombreado. De hecho, escribir sombreadores es lo más parecido a escribir un programa que dibuje píxeles directamente; es solo que la tarjeta ejecutará mil copias de ese programa en paralelo, una por píxel.

pjc50
fuente
La APU de mi computadora portátil tiene 256 núcleos sombreadores a 686MHZ mientras que mi tableta tiene 192.
Suici Doga
Oye, el Titan X tiene 5760 núcleos.
Daniel
@Daniel ¿Hay algún juego en el que el Titan X vaya <30 fps a ultra alta? El Titan X es muy poderoso
Suici Doga
Ummm, uno de estos, tal vez: maximumpc.com/10-most-graphically-demand-pc-games
Daniel
@Daniel Los desarrolladores de esos juegos deben tener necesidad de 2-4 cartas Titan X :)
Suici Doga
14

Solo para agregar a la respuesta de joojaa , las cosas son todavía siendo atraídos pixel por pixel. Simplemente está generando los píxeles usando un sombreador / ensamblador / rasterizador de vértices, luego texturizándolos e iluminándolos con un sombreador de fragmentos. Todo esto se hizo en software en los años 90 cuando su tarjeta de video no era mucho más que un blitter y un buffer de cuadros, pero era lento como el infierno. De ahí la invención de las GPU modernas.

El cálculo matemático que está sucediendo es básicamente el mismo que en los días de Doom, pero ahora se ejecuta en cientos / miles de ALU de sombreadores en lugar de un puñado de núcleos de CPU. Las API se asignan básicamente al mismo conjunto de instrucciones de GPU detrás de escena. Solo están ahí para evitar que tenga que escribir un montón de ensamblado de GPU retorcido en múltiples plataformas de proveedores.

russ
fuente