Por que temos estruturas gráficas como OpenGL e DirectX, quando os jogos podem desenhar pixels diretamente?

16

Jogos e outros aplicativos graficamente intensivos usam estruturas como OpenGL e DirectX. Também requerem recursos como pixel shader e DX12.

Mas por que precisaríamos de todas essas estruturas e recursos de GPU quando poderíamos desenhar tudo pixel por pixel?

Primeiro, o jogo precisaria ser compilado de maneira a ser desenhado pixel por pixel. É provável que isso torne o jogo executável grande, mas será mais rápido e funcionará em qualquer GPU colorida de 32 bits (mesmo as antigas)?

Eu sei que os primeiros jogos em 3D foram desenhados pixel por pixel, mas por que eles não estão fazendo isso agora?

Suici Doga
fonte
Em geral, executar uma operação em muitas coisas é mais eficiente e fácil de se pensar do que fazer em cada coisa individualmente.
user541686
2
Porque todos os jogos precisariam ser reescritos para todas as placas gráficas. A menos que eles não usassem a placa gráfica, eles seriam lentos.
user253751
Eu acho que as empresas de GPU tem que criar seus próprios drivers DirectX
Suici Doga
11
"Mas por que precisaríamos de todas essas estruturas e recursos de GPU quando poderíamos desenhar tudo pixel por pixel?" foi assim que foi feito nos bons e velhos tempos. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake e a maioria dos outros jogos do final dos anos 90 usavam renderização de software pura (o Quake oferecia o renderizador OpenGL como uma opção).
28416 el.pescado
11
@MatthewRock Você não está sendo útil. Você certamente pode empacotar um sistema operacional com um jogo dentro de um contêiner de docker e distribuí-lo. Dessa forma, o usuário não precisa instalar dependências da biblioteca para sua distribuição.
Navin 28/03

Respostas:

23

A velocidade é a razão mais comum pela qual isso não é feito. Na verdade, você pode fazer o que propõe, se você criar seu próprio sistema operacional, isso será muito lento por razões arquitetônicas. Portanto, a suposição de que é mais rápido é um pouco falha. Mesmo que fosse mais rápido, seria menos eficiente em termos de desenvolvimento (como um aumento de velocidade de 1% por 10 vezes o trabalho).

Copiar os dados da CPU para a placa gráfica é uma operação relativamente lenta. Quanto menos você copiar, mais rápida será a velocidade de atualização. Idealmente, você teria a maioria dos dados em sua GPU e atualizaria apenas pequenos pedaços de dados. Há um mundo de diferença entre copiar mais de 320x200 pixels em comparação com 1920x1200 ou mais. Veja o número de pixels que você precisa atualizar cresce quadraticamente quando os lados crescem.

Exemplo: é mais barato dizer à GPU para mover a imagem 10 pixels para a direita do que copiar os pixels manualmente para a memória de vídeo em diferentes locais.

Por que você precisa passar por uma API? Simplesmente porque não é o seu sistema. O sistema operacional não pode permitir que você faça o que quiser por motivos de segurança. Em segundo lugar, porque o sistema operacional precisa abstrair o hardware, até o sistema operacional está conversando com o driver através de algum sistema abstraído, uma API, se você preferir.

Na verdade, eu classificaria a probabilidade de seu sistema ser mais rápido, se você fizer todo o trabalho sozinho, próximo de zero. É um pouco como comparar C e montagem. Claro que você pode escrever montagem, mas os compiladores são bastante inteligentes hoje em dia e otimizam cada vez melhor. É difícil melhorar manualmente, mesmo que você consiga que sua produtividade caia pelo ralo.

PS: Uma API não torna impossível fazer essa atualização, como nos jogos antigos. É apenas ineficiente isso é tudo. Não por causa da mente da API, mas porque é um período ineficiente.

PPS: É por isso que eles estão lançando o Vulkan.

joojaa
fonte
6
See the number of pixels you need to update grows exponetially when the sides grow.Quadraticamente, eu acho.
Cthulhu
"Copiar os dados da CPU para a placa gráfica é uma operação relativamente lenta". Isso é verdade, mas irrelevante. Copiando alguns milhões de pixels a 60 fps é facilmente alcançáveis ligações PCI-E mais ainda modestos (só exigiria algumas centenas de megabytes por segundo.)
Coxy
2
@ pjc50 Isso não está errado, mas também não é exatamente verdade. Uma GPU é especializada para executar um único programa (geralmente um sombreador) em paralelo em uma grande quantidade de dados. Portanto, você precisa executar as mesmas operações em muitos dados para realmente usar o poder de computação de uma GPU. Se o seu programa não funcionar, é melhor executar o programa na CPU.
Nero
2
x22x
11
Você fala sobre copiar e mover, mas o mais importante é a geração real de imagens. Você precisa determinar qual objeto será visível em que momento, como será iluminado, quais serão os efeitos da fumaça, etc. etc. As GPUs são altamente otimizadas para executar essas operações de forma rápida e paralela. As APIs facilitam a expressão de operações comuns.
IMIL
15

funciona em qualquer GPU colorida de 32 bits (mesmo as antigas)?

Um pouco de história aqui: foi assim que os jogos foram feitos no PC até os aceleradores gráficos começarem a ficar disponíveis em meados dos anos 90. Realmente funcionou em todo o hardware, porque o hardware não estava fazendo muito.

Um acelerador gráfico permite desenhar pixels consideravelmente mais rápido que uma CPU, usando hardware e paralelismo especializados. O acelerador contém vários núcleos de processador. Um PC de mesa terá entre 1 e 8 núcleos, dependendo da idade. Minha placa gráfica GTX970Ti possui 1664 (mil seiscentos e sessenta e quatro!) Núcleos. Obviamente, isso supera o PC em velocidade bruta por um longo caminho.

No entanto, os aceleradores não são padronizados e geralmente incluem truques estranhos de arquitetura de computadores para atingir sua velocidade. Para escrever um jogo que não seja personalizado para uma marca e modelo específico do cartão, é necessário que exista uma API. E é para isso que o DirectX, GL e os idiomas do shader são usados. De fato, escrever shaders é a coisa mais próxima de escrever um programa que desenha pixels diretamente - é apenas que o cartão executará mil cópias desse programa para você em paralelo, uma por pixel.

pjc50
fonte
APU do meu laptop tem 256 shader núcleos @ 686MHZ enquanto meu tablet tem 192.
Suici Doga
Ei, o Titan X tem 5760 núcleos.
27416 Daniel
@Daniel Existem jogos em que o Titan X vai <30fps em ultra-alto. O Titan X é muito poderoso #
Suici Doga
@ Daniel Os desenvolvedores desses jogos deve ter necessidade cerca de 2-4 Titan X cards :)
Suici Doga
14

Apenas para adicionar à resposta de joojaa , as coisas ainda estão sendo desenhadas pixel por pixel. Você está apenas gerando os pixels usando um sombreador / montador / rasterizador de vértices, texturizando e iluminando-os usando um sombreador de fragmentos. Tudo isso foi feito em software nos anos 90, quando sua placa de vídeo não era muito mais do que um buffer e um buffer de quadros, mas era lenta como o inferno. Daí a invenção das GPUs modernas.

A matemática do desenho que está acontecendo é basicamente a mesma de antigamente, mas agora está sendo executada em centenas / milhares de ALUs de shader, em vez de um punhado de núcleos de CPU. As APIs são mapeadas basicamente para o mesmo conjunto de instruções da GPU nos bastidores. Eles estão lá para impedir que você tenha que escrever uma tonelada de conjunto de GPU maciço em várias plataformas de fornecedores.

russ
fonte