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?
3d
gpu
performance
pixel-shader
pixels
Suici Doga
fonte
fonte
Respostas:
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.
fonte
See the number of pixels you need to update grows exponetially when the sides grow.
Quadraticamente, eu acho.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.
fonte
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.
fonte