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%?
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%?
Respostas:
Em geral, é porque
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.
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.
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.
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
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:
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.
Por algumas razões
EDIT: Para dar alguns números
2,8 Ghz Athlon-64 com GPU NV-6800. Os resultados são:
À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.
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.
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.
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.
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.
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).
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.
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.
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, ...).
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:
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.)