Todos os jogos são feitos desenhando cada quadro?

60

Eu sou um iniciante aprendendo sobre animação por computador (para jogos). Até agora, o único método que encontrei é desenhar cada quadro, cada atualização de quadro. Portanto, no início de cada quadro, o quadro inteiro é apagado e, em seguida, as coisas necessárias para esse quadro são redesenhadas.

Minha pergunta é se esse método é ou não o único usado para criar animações e jogos. Parece que é um pouco ineficiente. Também não entendo bem como esse método funcionaria para jogos 3D . Alguém poderia explicar isso com mais detalhes?

eeze
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
Josh
John Carmack quase inventou a abordagem no PC para fazer rolagem lateral em tela cheia, desenhando apenas a fina fatia vertical da tela que mudou. Os PCs simplesmente não foram capazes de atualizar a exibição em tela cheia com rapidez suficiente sem essa técnica. Ele usou isso em muitos jogos 2D no início dos anos 90, como o Comandante Keen. Leia "Masters of Doom" para mais informações.
Ash

Respostas:

68

Jogos muito antigos usavam uma técnica em que apenas as partes de um quadro são redesenhadas que mudavam nesse quadro. O que me lembro, o jogo "Little Big Adventure" usa essa técnica (1994). Mas você pode ver que o jogo tem na maioria das vezes uma câmera estática. somente quando você sai da área visível a cena é redesenhada. Se você jogar, também notará um pequeno atraso nesse quadro. Nas GPUs modernas com mecanismos de jogos modernos, as coisas mudaram. Tudo é redesenhado em cada quadro. Dependendo da técnica de renderização, as coisas podem até ser renderizadas várias vezes. O poder de computação de uma GPU é incrivelmente alto quando você a usa corretamente. Mas a reutilização está acontecendo. Por exemplo, um mecanismo pode decidir atualizar o mapa de sombra apenas a cada 5 quadros. Ou a iluminação não é atualizada desde que não haja alterações nas fontes de luz.

Arne
fonte
23
Não são apenas jogos antigos. Na EA, houve um esforço para reduzir o uso da bateria do laptop em certos jogos "casuais", e uma técnica era redesenhar apenas partes da tela. Às vezes, era possível ver isso no The Sims 3 se você deixasse a câmera parada e um sim atravessasse a tela, às vezes haveria um bug em que o redesenho não era grande o suficiente e você veria pixels deixados para trás em uma linha do outro lado da tela tela. Você só precisava mover a câmera levemente para forçar um redesenho completo e a linha desapareceria.
Kevin Fee
12
Muito velho .. 1994 ... Eu me sinto velho agora ...
também
4
@alseether velho em termos de jogos. Lembre-se de que passamos de blobs de pixel de 8 bits para o foto-realismo (em cenas pré-renderizadas, se não em ação ao vivo) em apenas 20 a 30 anos.
Jared Smith
16

Não.

Pelo menos se você incluir jogos antigos dos anos 70 que usavam telas vetoriais.

Por exemplo, o conhecido jogo Asteroids, originalmente desenvolvido para exibições vetoriais, que é uma maneira fundamentalmente diferente de renderizar gráficos em uma tela.

Os monitores vetoriais também foram usados ​​por alguns jogos de arcade do final da década de 1970 a meados da década de 1980, como Asteroids, Tempest e Star Wars. Atariou o termo Quadrascan para descrever a tecnologia quando usada em suas arcadas de videogame.

https://en.wikipedia.org/wiki/Vector_monitor

Os gráficos modernos são praticamente 100% feitos para rasterização, que, por definição, grava o conteúdo de um buffer gráfico no monitor em cada quadro.

Sandy Chapman
fonte
7
As exibições de vetor nem mesmo obviamente possuem um "quadro".
Hbbs #
2
@ Hobbs Correto, o que torna minha resposta ainda correta, pois a resposta para "Todos os jogos são feitos desenhando cada quadro?" é "Não, nem todos os jogos são baseados em quadros".
Sandy Chapman
11
no entanto, em um sentido mais profundo, a questão era desenhar repetidamente todos os itens visíveis, não apenas os itens que se movem, e para a maioria das exibições de vetores a resposta ainda é "sim" (o tubo de armazenamento de imagens seria uma exceção)
szulat
@szulat de uma maneira que é verdade, mas para ser justo, ele ainda não identifica as lacunas em que a tela é preta. Ele atualiza apenas os itens visíveis na tela. Ou seja, em Asteróides, ele está apenas redesenhando a nave e os asteróides restantes na tela.
Sandy Chapman
@SandyChapman e em outro nível, há realmente pouca diferença. um jogo atualiza a memória da tela ou sprites quando algo muda. caso contrário, a parte correspondente da tela permanecerá estática. isso é verdade tanto para sistemas de varredura quanto para vetores - “asteróides” lida com a atualização da tela (memória!) sem incomodar a CPU, da mesma forma que o hardware do espectro zx gera seu sinal de vídeo raster. se o feixe crt real ou imaginário está desenhando polígonos ou escaneando a tela em um padrão fixo, é secundário.
precisa saber é
11

No nível mais baixo, o processador gráfico da sua máquina computará cada quadro do zero e o enviará para a tela. Você só será exposto a isso, no entanto, se você gerenciar esse material de baixo nível [1] Qualquer mecanismo gráfico (e com esse jogo), no entanto, manipulará essas coisas para você e você é livre para expressar a cena. em termos de muitas entidades que você pode modificar entre os quadros, mas será persistente.

... como esse método funcionaria para jogos em 3D ...

Os elementos no espaço 3D são persistentes, e o mecanismo gráfico recompõe novamente a imagem na tela por quaisquer alterações que ocorrerem (movimento da câmera etc.)

[1] ... por exemplo, se você escrever seu próprio mecanismo [2] com algo como o OpenGL. Mesmo nesse caso, você provavelmente armazenaria coisas persistentes entre os quadros.

[2] O que não é uma opção no seu nível de habilidade atual.

TauCraft
fonte
Você tem referências para apoiar "o processador gráfico em sua máquina realmente computa cada quadro do zero"?
Kromster diz apoio Monica
@ Kromster: É principalmente uma questão de eficiência. Como cada quadro pode exigir uma computação completa, e não se sabe exatamente quais partes não, você precisaria de um cálculo caro para determinar exatamente quais bits poderiam ser salvos. Mesmo que fosse uma melhoria líquida de desempenho, isso levaria a taxas de quadros inconsistentes.
MSalters
O @MSalters da maneira como é formulado, contradiz muitos pontos em muitas respostas dos vizinhos.
Kromster diz apoio Monica
Eu diria que a afirmação "o processador gráfico em sua máquina realmente calculará cada quadro do zero" é tecnicamente falso. A GPU calcula exatamente o que você pede. Se você deseja reutilizar o quadro anterior, será (de fato, esse é o padrão). Muitos mecanismos de jogo modernos (e até mesmo as GUIs do sistema operacional) optam por começar do zero (onde o quadro anterior é mostrado apenas se o novo quadro não terminar a renderização a tempo), mas eles não precisam.
Ove
Não tenho certeza do que constituiria uma referência para "a tela precisa ser limpa", mas tenho uma referência sobre como um quadro é renderizado no Doom: adriancourreges.com/blog/2016/09/09/doom-2016- estudo gráfico ; não esqueça que uma placa de vídeo de gama média moderada deve poder gerenciar um trilhão de cálculos por segundo, vários milhares por pixel.
Pjc50
2

Resposta curta: Não.

Longa história:

Quando aprendi alguma programação de jogos na escola, fomos ensinados a fazer o seguinte:

Decida qual taxa de fps queríamos no jogo (30 por exemplo).

Escreva um código que adicione 1 a um contador para cada intervalo (33 ms por 30 fps). Esse código é executado simultaneamente com o loop do jogo.

Em seguida, o loop do jogo que faz os cálculos para o jogo (atualização do estado do jogo) reduzirá o mesmo contador em 1 para cada quadro. Mas os cálculos gráficos e o desenho na tela só serão feitos se o contador estiver em zero.

O resultado é que a taxa de quadros gráficos será ajustada dependendo de quão bem a CPU lida com os cálculos no jogo. Quando não há muita coisa acontecendo no jogo, os cálculos são fáceis e a taxa de quadros dos gráficos será maior que a atualização real do estado do jogo (basicamente desperdiçando ciclos, já que desenhamos o mesmo estado do jogo mais de uma vez na tela).

Porém, muita coisa está acontecendo no jogo, a CPU terá mais trabalho a fazer e as atualizações de estado do jogo serão priorizadas sobre o desenho na tela.

Na maioria das vezes, o jogo continuará atualizando na taxa pretendida, mas parecerá "lento", pois você não verá cada atualização na tela. Isso pode ser preferível à desaceleração do jogo inteiro, porque você o força a desenhar cada atualização na tela.

Tudo isso foi feito com C ++ e sem mecanismo de jogo, nem placa gráfica. Tudo correu em um único núcleo da CPU. Utilizamos algumas bibliotecas para gráficos 2D.

user985366
fonte
11
Lembro-me do jogo "Golden Axe". Quando jogado em 8086, a jogabilidade era mais lenta e muito mais fácil de manusear do que em 286, por exemplo, onde as coisas se moviam mais rapidamente. Apenas para sua informação.
akostadinov 6/0318
0

Antes que se possa dizer se os videogames "desenham" a tela a cada quadro, é necessário primeiro definir o que se entende por "desenhar". Certamente existem muitos jogos de vídeo que nem todos desenham todos os quadros montando um bitmap do zero; Na verdade, muitas plataformas de jogos nunca mais montar bitmaps completos em tudo .

Existem algumas abordagens que os videogames podem adotar para gerar uma exibição. Um número muito pequeno faz com que a CPU ligue e desligue o feixe de elétrons ou para cada pixel ou, para jogos de varredura de vetor, defina a coordenada XY de cada ponto a ser plotado. A maioria dos jogos que fazem isso o faz em grande parte com o objetivo de demonstrar que a CPU é rápida o suficiente. Mais comumente, os jogos terão hardware que, na ausência de envolvimento da CPU, produziria algum padrão de pixels ou vetores para a tela repetidamente. Esse padrão pode ser produzido pela leitura sequencial de dados de uma região da memória e pela interpretação de cada bit ou grupo de bits como uma cor de pixel (isso é chamado de exibição de mapa de bits). Em alguns casos, o hardware pode ler um byte de memória para cada 8x8, 16x16, ou outra região de tamanho da tela e, em seguida, use esse byte para selecionar um intervalo de memória para leitura de dados de pixel (isso geralmente é chamado de exibição no mapa de caracteres). Algumas plataformas de hardware podem sobrepor várias exibições de bitmap com posições configuráveis. Estes são referidos como sprites.

Algumas plataformas não permitem que o padrão de exibição seja alterado enquanto está sendo enviado para a tela, mas exigem que todas as atualizações ocorram depois que a viga terminar de desenhar um quadro, mas antes de começar a desenhar no próximo. Nessas plataformas, tudo o que será exibido em um quadro precisa ser carregado no hardware da tela antes do início desse quadro, e a exibição será limitada a mostrar um padrão que pode ser configurado de uma só vez. Se a CPU parar de funcionar enquanto o quadro estiver sendo mostrado, esse mesmo quadro continuará sendo mostrado indefinidamente. Outras plataformas permitem que o padrão seja alterado ou reconfigurado enquanto está sendo desenhado na tela. Isso torna possível mostrar uma tela que é muito mais complicada do que o circuito de vídeo poderia suportar por si só.

A maioria dos jogos de computador pessoal usa hardware configurado para desenhar uma única tela de bitmap e depois desenhar nessa tela qualquer coisa que precise ser diferente do que já existe. Às vezes, pode ser mais fácil desenhar coisas sem levar em consideração se é realmente necessário em um caso específico, mas se o código puder dizer facilmente que não há razão para que parte da tela seja alterada, o desempenho poderá ser melhorado ignorando essa parte. As plataformas de hoje costumam ser rápidas o suficiente para desenhar a tela inteira várias vezes durante o curso de um quadro, mas historicamente esse não era o caso. O código mais rápido possível para escrever todos os pixels na tela de alta resolução do computador Apple II, por exemplo, levaria mais de dois quadros, e o código mais rápido possível para copiar todos os pixels no computador Apple II ' A tela de alta resolução de outro buffer levaria o dobro disso. Para obter um bom desempenho, é necessário que os jogos atualizem apenas as coisas que realmente estavam mudando, e é isso que os bons jogos geralmente fazem.

supercat
fonte
11
Cheguei no meio dessa resposta e não tenho certeza de como ela está realmente respondendo à pergunta. Seu primeiro parágrafo fala sobre CPUs, coordenadas XY, feixes de elétrons, bytes de memória e sprites - mas nada disso é visivelmente sobre desenhar cada quadro. O segundo parágrafo está falando sobre padrões de exibição detalhadamente e depois me perde. Eu acho que você precisa pegar qualquer parte disso, na verdade, redesenhar a tela, colocá-la no topo em uma declaração clara e, em seguida, conectar o que mais você precisa falar para explicar o que está acontecendo.
Doppelgreener 6/0318
11
@doppelgreener: A noção de "desenhar" cada quadro é um pouco vaga. Algo precisa fazer todo o necessário para gerar cada quadro, mas há muitas maneiras pelas quais o trabalho pode ser dividido pela CPU e pelo hardware. Algumas maneiras exigem que a CPU esteja envolvida em todos os quadros, mesmo com partes da tela que parecem iguais entre um quadro e outro, enquanto outras não. Embora qualquer jogo de LCD ou CRT exija, em última análise, que algo produza todos os quadros que não estejam em branco [os jogos que usam papel eletrônico ou tela de flip-chart podem não], as ações necessárias podem ou não ser consideradas "desenho".
Supercat
Eu sugiro que você comece no idioma direto (se queremos "desenhar um quadro" constantemente) e trabalhe de volta a partir daí, explicando mais detalhes técnicos sobre por que essa pode não ser uma maneira precisa de colocá-lo - em vez de mergulhar direto nos detalhes . Sua postagem precisa de um resumo executivo, basicamente, e de uma introdução antes de começar a examinar as coisas com profundidade.
doppelgreener
-11

Para resumir, eu diria que nem todos os quadros são desenhados, mas apenas os necessários para apresentar sua história ou tema de jogo ou jogabilidade. Além disso, o momento das coisas que você gostaria que acontecesse em determinadas instâncias seria importante.

Sakib Zang
fonte
9
Isso nem faz sentido contra a pergunta feita. Eu acho que você confundiu o "quadro" de outra coisa ... você está possivelmente ficando confuso com os elementos de um storyboard? OP é especificamente falando de quadros no contexto de renderização
Trotski94