Como os jogos 3D são tão eficientes? [fechadas]


188

Há algo que eu nunca entendi. Como um grande jogo para PC como o GTA IV pode usar 50% da minha CPU e rodar a 60fps, enquanto uma demonstração DX de um bule rotativo a 60fps usa 30%?


124
Não vejo o que há de errado com essa pergunta - é perfeitamente natural ficar curioso sobre como outros desenvolvedores realizaram certas coisas. Deveríamos encorajar esse tipo de curiosidade, não puni-lo com votos íntimos.
John Feminella

2
@ user146780: quem fez a pergunta ... Os melhores programadores que conheci onde trabalhavam em CGI. Gurus da SGI, pessoas trabalhando paralelamente no Adobe Photoshop, etc. As pessoas aqui não percebem o quão complicado é escrever um jogo moderno nem o quão habilidosos esses codificadores são. Se você quer uma experiência humilhante, veja o que os alemães da Cryotech fizeram com o mecanismo Crysis. Existem vídeos no Youtube. Você simplesmente não vai acreditar. Não se trata apenas de "usar octrees". Normalmente, esses programadores são simplesmente muito mais qualificados do que os programadores comuns. E você pode apostar que os codificadores GT4 são muito bons.
SyntaxT3rr0r

2
você tem o gta4 rodando a 60fps !? GW! O gta4 é um POS que funciona muito mal; também ouvi o Force desencadear. Eu diria que a euforia é a culpada. Sinceramente, o "uso da CPU" é uma maneira muito ruim de comparar, basta desvendar a taxa de quadros e ver qual deles roda mais rápido, é a maneira correta de fazê-lo. Além disso, lembre-se, esse "jogo complicado", embora possa render muitas coisas, ainda existe apenas uma tela, e, se for renderizado na ordem certa, você poderá acabar com a mesma quantidade de pixels que o seu demo "simples", e o trabalho com pixels é realmente o que o mata.
matt

8
Você precisa de um profiler que mostre quanto a GPU (Unidade de processamento gráfico) é usada. Aposto que o GTA IV mostra ~ 99% e a demonstração, 3%.
0scar

Por experiência, cerca de 10% dos programadores de jogos com quem trabalhei eram bons, o restante era na média, na melhor das hipóteses. Alguns eram totalmente incompetentes.
Skizz 23/09/10

Respostas:


69

Em geral, é porque

  1. Os jogos estão sendo ótimos sobre o que eles precisam renderizar, e
  2. Eles tiram vantagem especial do seu hardware.

Por exemplo, uma otimização fácil que você pode fazer envolve não tentar desenhar coisas que não podem ser vistas. Considere uma cena complexa como uma paisagem urbana de Grand Theft Auto IV . O renderizador não está processando todos os prédios e estruturas. Em vez disso, está renderizando apenas o que a câmera pode ver. Se você pudesse voar de volta para a parte traseira dos mesmos prédios, de frente para a câmera original, veria uma estrutura de concha escavada pela metade. Todos os pontos que a câmera não pode ver não são renderizados - já que você não pode vê-la, não há necessidade de tentar mostrá-la.

Além disso, existem instruções otimizadas e técnicas especiais quando você está desenvolvendo um conjunto específico de hardware, para permitir acelerações ainda melhores.

A outra parte da sua pergunta é por que uma demonstração usa tanta CPU:

... enquanto uma demonstração DX de um bule rotativo a 60fps usa uns 30% incríveis?

É comum que as demos das APIs gráficas (como dxdemo) retornem ao que é chamado de renderizador de software quando o seu hardware não suporta todos os recursos necessários para mostrar um exemplo bonito. Esses recursos podem incluir coisas como sombras, reflexão, rastreamento de raios, física etc.

Isso imita a função de um dispositivo de hardware com todos os recursos que é improvável que exista, a fim de mostrar todos os recursos da API. Mas como o hardware não existe, ele roda na sua CPU. Isso é muito mais ineficiente do que delegar a uma placa gráfica - daí o alto uso da CPU.


3
Uma demonstração do DX também usa seu hardware. Então, o que é 'especial'?
tur1ng

3
mas é improvável que uma demonstração seja ótima.
µBio 07/02/10

2
@ tur1ng, a demonstração do bule, por exemplo, pode ter permitido reflexos , sombras e outros efeitos.
Nick Dandoulakis

2
O bule pode ter mais polígonos do que uma cena do GTA4. O fato é que o gargalo atual na renderização gráfica é mais efeitos de textura, como técnicas derivadas de mapeamento de bump para adicionar detalhes e outros efeitos pós-renderização.
Klaim

5
Texturas - o bule está sendo criado a partir de um grande número de triângulos individuais, todos com interações normais e de iluminação. O que parece um mundo 3d insanamente complexo no jogo geralmente é bastante simples, grandes blocos cobertos com uma imagem detalhada. Um monte de '3d' é sombra e perspectiva efeitos artísticos inteligentes em uma imagem 2D estática desenhada na forma 3d
Martin Beckett

96

Paciência, habilidade técnica e resistência.

O primeiro ponto é que uma demonstração do DX é principalmente uma ajuda didática, portanto é feita para maior clareza e não velocidade de execução.

É um assunto bastante grande para condensar, mas o desenvolvimento de jogos é principalmente sobre como entender seus dados e seus caminhos de execução em um grau quase patológico.

  1. Seu código foi desenvolvido em torno de duas coisas - seus dados e seu hardware de destino.
  2. O código mais rápido é o código que nunca é executado - classifique seus dados em lotes e faça apenas operações caras nos dados necessários
  3. Como você armazena seus dados é fundamental - procure obter acesso contíguo, permitindo que você processe em lote em alta velocidade.
  4. Parelize tudo o que puder
  5. As CPUs modernas são rápidas, a RAM moderna é muito lenta. As falhas de cache são mortais.
  6. Empurre o máximo possível para a GPU - ela possui memória local rápida, para que possa penetrar nos dados, mas você precisa ajudá-lo organizando seus dados corretamente.
  7. Evite fazer muitas opções de renderstate (novamente agrupe dados semelhantes de vértices), pois isso faz com que a GPU pare
  8. Swizzle suas texturas e garanta que são duas potências - isso melhora o desempenho do cache de textura na GPU.
  9. Use os níveis de detalhe o máximo que puder - versões baixa / média / alta de modelos 3D e alterne com base na distância do player de câmera - não faz sentido renderizar uma versão em alta resolução se houver apenas 5 pixels na tela.

39

Os jogos em 3D são ótimos para enganar seus olhos. Por exemplo, existe uma técnica chamada oclusão ambiental do espaço da tela (SSAO), que dará uma sensação mais realista ao sombrear as partes de uma cena que estão próximas das descontinuidades da superfície. Se você observar os cantos da parede, na maioria dos casos, eles parecerão um pouco mais escuros do que os centros.

O mesmo efeito pode ser alcançado usando a radiosidade, que é baseada em uma simulação bastante precisa. A radiosidade também levará em consideração mais efeitos das luzes refletidas, etc., mas é computacionalmente caro - é uma técnica de rastreamento de raios.

isso é apenas um exemplo. Existem centenas de algoritmos para gráficos de computador em tempo real e eles são essencialmente baseados em boas aproximações e geralmente fazem muitas suposições. Por exemplo, a classificação espacial deve ser escolhida com muito cuidado, dependendo da velocidade, da posição típica da câmera e da quantidade de alterações na geometria da cena.

Essas 'otimizações' são enormes - você pode implementar um algoritmo de maneira eficiente e executá-lo 10 vezes mais rápido, mas escolher um algoritmo inteligente que produza um resultado semelhante ("trapaça") pode fazer você passar de O (N ^ 4) a O ( log (N)).

Otimizar a implementação real é o que torna os jogos ainda mais eficientes, mas isso é apenas uma otimização linear.


30

Eeeeek!

Eu sei que essa pergunta é antiga, mas é emocionante que ninguém tenha mencionado o VSync !!! ???

Você comparou o uso da CPU do jogo a 60fps ao uso da CPU da demonstração do bule a 60fps.

Não é aparente que ambos correm (mais ou menos) a exatamente 60fps? Isso leva à resposta ...

Ambos os aplicativos são executados com o vsync ativado! Isso significa (embaçado) que a taxa de quadros de renderização está bloqueada no "intervalo em branco vertical" do seu monitor. O hardware gráfico (e / ou driver) será renderizado apenas no máximo. 60fps. 60fps = taxa de atualização de 60Hz (Hz = por segundo). Portanto, você provavelmente usa um CRT oscilante bastante antigo ou um monitor LCD comum. Em um CRT rodando a 100Hz, você provavelmente verá taxas de quadros de até 100Hz. O VSync também se aplica de maneira semelhante aos monitores LCD (eles geralmente têm uma taxa de atualização de 60Hz).

Portanto, a demonstração do bule pode realmente ser muito mais eficiente! Se ele usa 30% do tempo da CPU (em comparação com 50% do tempo da CPU no GTA IV), provavelmente usa menos tempo da CPU em cada quadro e aguarda apenas o próximo intervalo vertical em branco. Para comparar os dois aplicativos, desative o vsync e meça novamente (você medirá fps muito mais altos para os dois aplicativos).

Às vezes, é bom desativar o vsync (a maioria dos jogos tem uma opção em suas configurações). Às vezes, você verá "rasgando artefatos" quando o vsync estiver desativado.

Você pode encontrar detalhes e por que é usado em wikipedia: http://en.wikipedia.org/wiki/Vsync


Concordo que, para obter uma comparação melhor, você deve desativar o vsync. No entanto, a raiz do problema ainda permanece. 30% para o bule de chá vs 50% de uso da CPU no jogo é uma diferença menor do que se poderia esperar normalmente. Mas eu me lembro nos primeiros dias em que o mapeamento do ambiente começou a se popularizar e a demo da nVidia na época era um bule de chá mapeado pelo ambiente girando. Essas demos geralmente nem atingiam 60 fps no dia. Acho que o que quero dizer é que essas demonstrações de bule muitas vezes aumentam os limites de um novo efeito visual.
21411 Steve Jobs

25

Embora muitas respostas aqui forneçam excelentes indicações de como vou responder à pergunta mais simples de por que

Talvez o melhor exemplo (certamente um dos mais conhecidos) seja o software de identificação. Eles perceberam muito cedo, nos dias do Comandante Keen (bem antes do 3D), que surgiam uma maneira inteligente de conseguir algo 1 , mesmo que dependesse de hardware moderno (neste caso, uma placa de vídeo EGA!) Que era graficamente superior a a competição que isso faria seu jogo se destacar. Isso era verdade, mas eles perceberam ainda que, em vez de criar novos jogos e se contentar, poderiam licenciar a tecnologia, obtendo renda de outras pessoas e, ao mesmo tempo, desenvolvendo a próxima geração de motores e, dessa forma, dando um salto na concorrência novamente. .

As habilidades desses programadores (juntamente com o conhecimento de negócios) é o que os tornou ricos.

Dito isto, não é necessariamente o dinheiro que motiva essas pessoas. Provavelmente, é tanto o desejo de alcançar, de realizar. O dinheiro que eles ganharam nos primeiros dias significa simplesmente que agora eles têm tempo para dedicar ao que gostam. E enquanto muitos têm interesses externos, quase todos ainda programam e tentam descobrir maneiras de fazer melhor do que a última iteração.

Simplificando, a pessoa que escreveu a demonstração do bule provavelmente teve um ou mais dos seguintes problemas:

  • menos tempo
  • menos recursos
  • menos incentivo à recompensa
  • menos concorrência interna e externa
  • objetivos menores
  • menos talento

O último pode parecer duro 2, mas claramente existem alguns que são melhores que outros, as curvas dos sinos às vezes têm fins extremos e tendem a ser atraídos pelos fins extremos correspondentes do que é feito com essa habilidade.

Os objetivos menores provavelmente são o principal motivo. O objetivo da demonstração do bule era apenas isso, uma demonstração. Mas não é uma demonstração da habilidade dos programadores 3 . Seria uma demonstração de uma pequena faceta de um (grande) sistema operacional, nesse caso a renderização DX.

Para aqueles que assistiram à demonstração, não usariam muito mais CPU do que o necessário , desde que parecesse bom o suficiente. Não haveria incentivo para eliminar o desperdício quando não houvesse beneficiário. Em comparação, um jogo adoraria ter ciclos de reposição para melhor IA, melhor som, mais polígonos, mais efeitos.


  1. nesse caso, rolagem suave no hardware do PC
  2. Provavelmente mais do que eu, então estamos claros sobre isso
  3. estritamente falando, teria sido uma demonstração para o gerente também, mas novamente a unidade aqui seria tempo e / ou qualidade visual.

17

Por algumas razões

  • Motores de jogos em 3D são altamente otimizados
  • a maior parte do trabalho é feita pelo seu adaptador gráfico
  • 50% Hm, deixe-me adivinhar que você tem um núcleo duplo e apenas um núcleo é usado ;-)

EDIT: Para dar alguns números

2,8 Ghz Athlon-64 com GPU NV-6800. Os resultados são:

  • CPU: 72.78 Mflops
  • GPU: 2440.32 Mflops

@ stacker: você está sugerindo que toda a computação que ocorre em jogos 3D de alto nível que não são feitos pela GPU é realmente mono-threaded e, por alguma chance, preencheria 100% da CPU? O que significa que os perfs do jogo seriam vinculados a um núcleo não GPU? Acho isso muito difícil de acreditar.
SyntaxT3rr0r

4
Isso não implica que o programa seja monoencadeado - apenas implica que pelo menos um encadeamento está indo o mais rápido possível. O que é razoável, porque por que você gostaria que fosse mais lento? Por outro lado, muitos jogos são quase totalmente monoencadeados. É muito difícil escrever simulações complexas de maneira eficaz ao realizar multithreading porque a situação típica em sistemas simultâneos / distribuídos de aceitar um pouco mais de latência para comprar muito mais throughput não é boa para um jogo que deveria ser responsivo.
Kylotan

8

Às vezes, uma cena pode ter mais coisas acontecendo do que parece. Por exemplo, um bule rotativo com milhares de vértices, mapeamento de ambiente, mapeamento de bump e outros shaders de pixel complexos sendo renderizados simultaneamente equivale a muito processamento. Muitas vezes, essas demos para bules simplesmente servem para exibir algum tipo de efeito especial. Eles também podem nem sempre fazer o melhor uso da GPU quando o desempenho absoluto não é o objetivo.

Em um jogo, você pode ver efeitos semelhantes, mas eles geralmente são feitos de maneira comprometida, para maximizar a taxa de quadros. Essas otimizações se estendem a tudo que você vê no jogo. A questão se torna: "Como podemos criar a cena mais espetacular e realista com a menor quantidade de poder de processamento?" É o que faz dos programadores de jogos alguns dos melhores otimizadores do mercado.


4
  1. Gerenciamento de cena. kd-trees, seleção de frustração, bsps, caixas delimitadoras heirárquicas, conjuntos de visibilidade parcial.
  2. LOD. Alternando versões com detalhes mais baixos para substituir objetos distantes.
  3. Impostors. Como LOD, mas nem mesmo um objeto é apenas uma imagem ou 'outdoor'.
  4. SIMD.
  5. Gerenciamento de memória personalizado. Memória alinhada, menos fragmentação.
  6. Estruturas de dados personalizadas (ou seja, sem STL, modelagem relativamente mínima).
  7. Montagem em locais, principalmente para SIMD.

4

Por todas as respostas qualificadas e boas dadas, a que falta ainda está em questão: O contador de utilização da CPU do Windows não é muito confiável. Eu acho que essa demonstração simples de bule apenas chama a função de renderização em seu loop inativo, bloqueando a troca de buffer.

Agora, o contador de utilização da CPU do Windows apenas analisa quanto tempo de CPU é gasto em cada processo, mas não como esse tempo de CPU é usado. Tente adicionar um

Sleep(0);

logo após retornar da função de renderização e compare.


Eu tive uma demonstração do bule DX que sempre usava 25% da minha CPU. Acontece que era porque eu estava em um quad core e, para travar o loop do jogo a 60 qps, eu tinha um loop "Já estamos lá?", Que verificava constantemente o tempo. Eu mudei para o sono (timeToNextFrame) eo uso da CPU caiu para quase a 0.
Jonathan Pierce

3

Além disso, existem muitos truques do ponto de vista artístico para economizar energia computacional. Em muitos jogos, especialmente os mais antigos, as sombras são pré-calculadas e "cozidas" diretamente nas texturas do mapa. Muitas vezes, os artistas tentavam usar aviões (dois triângulos) para representar coisas como árvores e efeitos especiais quando pareciam basicamente os mesmos. A neblina nos jogos é uma maneira fácil de evitar a renderização de objetos distantes e, frequentemente, os jogos têm várias resoluções de cada objeto para visualizações remotas, médias e próximas.


1

O núcleo de qualquer resposta deve ser este: as transformações que os mecanismos 3D realizam são especificadas principalmente em adições e multiplicações (álgebra linear) (sem ramificações ou saltos); as operações de um desenho em um único quadro geralmente são especificadas de uma maneira que várias os trabalhos desse add-mul podem ser feitos em paralelo. Os núcleos de GPU são ótimos add-mul e incluem dezenas ou centenas de núcleos add-mull.

A CPU fica com coisas simples - como IA e outra lógica do jogo.


1

Como um grande jogo para PC como o GTA IV pode usar 50% da minha CPU e rodar a 60fps, enquanto uma demonstração DX de um bule rotativo a 60fps usa 30%?

Embora seja provável que o GTA seja mais eficiente do que a demonstração do DX, medir a eficiência da CPU dessa maneira está essencialmente quebrado. A eficiência pode ser definida, por exemplo, quanto trabalho você faz por um determinado período. Um contra-exemplo simples: gera um encadeamento por uma CPU lógica e permite que um loop infinito simples seja executado nele. Você obterá 100% de uso da CPU, mas não é eficiente, pois nenhum trabalho útil é feito.

Isso também leva a uma resposta: como um jogo pode ser eficiente? Ao programar "grandes jogos grandes", um grande esforço é dedicado para otimizar o jogo em todos os aspectos (que hoje em dia geralmente também incluem otimizações de vários núcleos). Quanto à demonstração do DX, seu objetivo não é correr rápido, mas sim demonstrar conceitos.


1

Eu acho que você deveria dar uma olhada na utilização da GPU em vez da CPU ... Aposto que a placa gráfica é muito mais movimentada no GTA IV do que na amostra do Teapot (deve estar praticamente inativa).

Talvez você possa usar algo como este monitor para verificar se:

http://downloads.guru3d.com/Rivatuner-GPU-Monitor-Vista-Sidebar-Gadget-download-2185.html

Além disso, a taxa de quadros é algo a considerar, talvez a amostra do bule esteja sendo executada em velocidade máxima (talvez 1000fps) e a maioria dos jogos esteja limitada à frequência de atualização do monitor (cerca de 60fps).


1

Veja a resposta no vsync; é por isso que eles estão sendo executados na mesma taxa de quadros.

Em segundo lugar, a CPU é a líder em um jogo. Uma explicação simplificada é que o loop principal do jogo é apenas um loop infinito:

while(1) { 
  update();
  render();
}

Mesmo que seu jogo (ou, neste caso, bule) não esteja fazendo muito, você ainda está consumindo a CPU em seu loop.

O processador de 50% no GTA é "mais produtivo" que os 30% na demonstração, pois é mais do que provável que ele não esteja fazendo muito; mas o GTA está atualizando muitos detalhes. Mesmo adicionar um "Sleep (10)" à demo provavelmente reduzirá sua CPU em uma tonelada.

Por fim, observe o uso da GPU. A demo provavelmente está levando <1% em uma placa de vídeo moderna, enquanto o GTA provavelmente estará tomando a maioria durante o jogo.

Em resumo, seus benchmarks e medições não são precisos.


1

A demonstração do bule DX não está usando 30% da CPU, fazendo um trabalho útil. É uma espera ocupada porque não tem mais nada a fazer.


0

Pelo que sei da série Unreal, algumas convenções são quebradas como encapsulamento. O código é compilado no bytecode ou diretamente no código da máquina, dependendo do jogo. Além disso, os objetos são renderizados e empacotados sob a forma de malhas e coisas como texturas, iluminação e sombras são pré-calculadas, enquanto uma animação 3D pura exige isso para esse tempo real. Quando o jogo está realmente rodando, também existem algumas otimizações, como renderizar apenas as partes visíveis de um objeto e exibir detalhes da textura somente quando close-up. Finalmente, é provável que os videogames sejam projetados para tirar o melhor proveito de uma plataforma em um determinado momento (por exemplo: Intelx86 MMX / SSE, DirectX, ...).


0

Acho que falta uma parte importante da resposta aqui. A maioria das respostas diz para você "conhecer seus dados". O fato é que você deve, da mesma maneira e com o mesmo grau de importância, também conhecer o seu:

  • CPU (relógio e caches)
  • Memória (frequência e latência)
  • Disco rígido (em termos de velocidade e tempo de busca)
  • GPU (#cores, relógio e sua memória / caches)
  • Interfaces: controladores SATA, revisões de PCI, etc.

Mas , além disso, com os computadores modernos atuais, você nunca seria capaz de reproduzir um vídeo 1080p real a >> 30ftp (uma única imagem 1080p em 64 bits levaria 15.000 Ko / 14,9 MB). A razão para isso é por causa da amostragem / precisão. Um videogame nunca usaria uma precisão dupla (64 bits) para pixels, imagens, dados, etc ..., mas usaria uma precisão personalizada menor (~ 4-8 bits) e às vezes menos precisão redimensionada com técnicas de interpolação para permitir uma computação razoável Tempo.

Também existem outras técnicas, como Recorte de dados (com o padrão OpenGL e implementação de software), Compactação de dados etc. Lembre-se de que as GPUs atuais podem ser> 300 vezes mais rápidas que as CPUs atuais em termos de capacidade de hardware. No entanto, um bom programador pode obter um fator de 10 a 20x, a menos que seu problema seja totalmente otimizado e completamente paralelizável (principalmente tarefa paralelizável).

Por experiência, posso dizer que a otimização é como uma curva exponencial. Para alcançar o desempenho ideal, o tempo necessário pode ser incrivelmente importante.

Então, para voltar ao bule, você deve ver como a geometria é representada, amostrada e com a precisão que Vs vê no GTA 5, em termos de geometria / texturas e, mais importante, os detalhes (precisão, amostragem etc.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.