Por que mudar para APIs de baixo nível

Matéria original de PCGamer.com

Traduzido por Marcus Sarmanho Hermes Marques

Editor chefe do site www.pcfacts.com.br


O lançamento do Windows 10 marca a primeira vez em que o público de PC gaming terá acesso a uma API de baixo nível disponível para todas as marcas de placas. Desde a apresentação que a AMD fez do Mantle em 2013, temos visto inúmeras discussões de como as API de baixo nível trazem benefícios aos games, efetivamente. Opiniões variam. Há quem diga se tratar no mínimo de uma revolução ao processamento gráfico e quem diga que não passa de um simples furor causado por marketing. O escopo deste artigo é mostrar o que exatamente o DirectX 12 oferece ao gamers, em que situações e quando veremos esses ganhos.

Para explicar não apenas o quê, mas o porquê disso tudo, detalharemos as escolhas envolvidas nos designs de várias APIs e o crescimento histórico que nos trouxe ao atual momento desta arte. Daqui para frente vai ficar técnico. Muito técnico. Se você só quer entender como estas mudanças afetarão você como gamer e o que você pode esperar de um upgrade para o Windows 10 agora e no futuro, acompanhe nosso site para a parte final da tradução desta matéria ("O que o DirectX 12 significa para os gamers" parte que ainda será disponibilizada logo logo), na qual tocamos nesse assunto sem você precisar dar esse profundo mergulho.


Uma breve história sobre DirectX e APIs

Antes de entrarmos nos detalhes do que muda no DirectX 12, algumas noções básicas devem ser definidas. Primeiro de tudo, o que é uma API 3D, na verdade? Quando um hardware acelerador 3D apareceu pela primeira vez no mercado, não havia uma necessidade de proporcionar aos programadores uma interface para alavancar suas capacidades - uma Application Programer Interface (API ou Interface de aplicação de programador) por assim dizer. Enquanto a Glide API específica do fornecedor desenvolvida pela 3DFX Interactive se garantiu por um tempo, já ficava óbvio que o crescimento contínuo do mercado iria demandar uma API abstrata, indepedente, livre, agnóstica e desvinculada ao hardware. Essa interface foi proporcionada pelo Open GL e pelo DirectX.

GPUs nesses tempos eram um hardware simples comparadas às atuais. No fim das contas, a API só precisava permitir ao desenvolvedor renderizar triângulos texturizados na tela, porque era isso que o hardware fazia. As capacidades dos hardware evoluíram rapidamente desde então e as APIs foram gradualmente ajustadas para se manter atualizadas, sendo adicionadas com uma vasta quantidade de recursos aqui e ali. Isso não quer dizer que não houveram significativas mudanças de API antes - a mudança de uma geração geométrica em modo imediato para ambos OpenGL e DirectX foi muito significativa, por exemplo.

Não menos importante, APIs de alto nível em PCs ainda operam sobre o princípio básico de evitar que os programadores se preocupem com detalhes a nível de hardware. Isso pode ser um recurso conveniente, mas às vezes, entender completamente o que está acontecendo com um hardware - que é o centro de uma API de baixo Nível - pode ser crucial para a performance.

Teste da Futuremark’s API Overhead, 2015


Porque mudar para APIs de baixo nível?


APIs de baixo nível são uma mudança grande para a programação 3D e isso requer mais esforços de engenheiros e designers em conjunto com fornecedores e vendedores de hardware, bem como desenvolvedores de jogos e middleware. Por 2 décadas, as APIs de alto nível eram "boas o bastante" em PCs para empurrar renderização 3D como em nenhuma outra plataforma. Então porque este esforço todo sendo rebuscado agora? Acreditamos que a razão é uma combinação de tipos de desenvolvimento bem distintos, que agora, juntos, corroboram para que implementem essa mudança.


O lado do Hardware


Um driver primário é certamente um desenvolvimento para o hardware, tanto sobre a GPU, mas talvez muito mais sobre o CPU. Pode parecer um contra-senso pensar que as mudanças no hardware do CPU causem sublevação em APIs gráficas, mas como as APIs servem como uma ponte entre um programa rodando na CPU e o poder de renderização da GPU, isso não é necessariamente surpreendente.


Como notado anteriormente, APIs de alto nível pareciam ser boas o bastante por duas décadas de desenvolvimento gráfico, começando nos anos 90. O gráfico acima ilustra o ponto flutuante de CPUs high end de desktop através do mesmo período de tempo, e deve lhe dar uma ideia de porque as implicações de performance de CPU e a paralelização de APIs gráficas não eram o que mais interessava aos designers dos anos 90 e 2000. Azul figura performance paralela, enquanto que a performance sequencial é figurada pelo laranja. Até 2004, as duas estavam bem páreas, mas os aumentos de performance sequencial tiveram uma queda considerável. Portanto, uma forma de ajustar as APIs é melhorando a paralelização nas mesmas.

Entretanto, enquanto que as performances sequenciais dos CPUs tiveram uma queda brusca em seu avanço e isso já parece ser a parte mais importante para mudança na API, as GPUs modernas são fundamentalmente distintas daquelas dos anos 90. Elas executam cálculos arbitrários em uma grande variedade de dados, criando geometrias por conta própria em vez de apenas gerenciar uma entrada de informações e melhorar o paralelismo em um assombroso número de níveis. Todas essas mudanças podem (e foram) moldadas às APIs existentes, mas não sem alguma divergência semântica considerável.

O lado do Software


Mesmo sendo o lado do hardware o mais importante da equação e certamente o de maior publicamente discutido, há também algumas razões para romper com as APIs atuais e estas razões estão inteiramente ligadas ao software. Todo PC gamer deve estar familiarizado com esta sequência de eventos: um novo jogo AAA super aguardado é lançado e ao mesmo tempo as duas grandes fornecedoras de GPUs lançam seus drivers "otimizados" para o game. Eles devem trazer ao game uma performance mais rápida,ou talvez seja necessário até para que o game funcione de modo geral.

Isso não ocorre porque os desenvolvedores dos jogos são incompetentes. É por conta do tamanho bruto à que chegaram as APIs para estas placas de alto nível com o passar dos anos, os acréscimos de mudanças e os ainda mais complexos drivers gráficos que precisam de alguma forma interpretar essas APIs abstratas de maneira que a placa de vídeo entenda e execute. Minimizar as responsabilidades dos drivers parece ser eficiente para aumentar sua confiabilidade - desenvolvedores familiares com ambas APIs, clamam que os drivers de DX12 já estão em um formato melhor que os de DX11 estavam em um ponto similiar de sua linha do tempo de desenvolvimento, fora as grandes novidades impostas pela nova API.

Ter um driver com código tão monstruoso não é apenas difícil aos fornecedores de GPUs: isso torna ainda mais desafiador - às vezes impossível - para os desenvolvedores diagnosticar bugs e problemas de performance por conta própria. Tudo no código base de games pode ser investigado e racionalizado usando ferramentas de desenvolvimento, mas somente o fornecedor do Hardware pode dizer o que está acontecendo por trás do muro da API.

Se o driver decide perder tempo a cada segundo reconstruindo uma estrutura de dados, causando stutter, será praticamente impossível via engenharia reversa dizer que parte do código do game - única parte que o desenvolvedor tem controle - é responsável. Como ilustrado acima, fazer API e driver menores e mais leves, elevando as responsabilidades do código do game, irá permitir aos desenvolvedores conseguir uma análise do que está ocorrendo em todos os casos.

#PC