Sprites na programação de jogos, vários arquivos versus uma "textura"?

StackOverflow https://stackoverflow.com/questions/1452828

  •  12-09-2019
  •  | 
  •  

Pergunta

Perdoe -me se minha linguagem não estiver correta, pois sou nova na programação de jogos. Eu tenho analisado alguns projetos de código aberto e notei que alguns sprites estão divididos em vários arquivos, todos agrupados para fazer com que um objeto 2D pareça animar. Isso é direto. Depois, verei uma abordagem diferente, com o objeto 2D tudo em um arquivo PNG ou algo semelhante, um ao lado do outro.

Existe uma vantagem de usar uma abordagem para outra? Os sprites devem estar em arquivos separados? Por que eles às vezes estão todos em uma folha?

Foi útil?

Solução

A abordagem anterior é tipicamente mais direta e fácil de programar, então você vê muito em projetos de código aberto.

A segunda abordagem é mais eficiente no hardware gráfico moderno, porque permite desenhar vários sprites diferentes de uma textura grande, especificando diferentes coordenadas U, V para selecionar cada sprite individual na folha composta. Como as coordenadas U, V podem ser transmitidas junto com dados de vértices para um shader, isso permite desenhar um grande grupo de sprites com muito mais eficiência do que você poderia se você tivesse que alternar texturas (o que significa alterar o estado do shader) para cada poli. Isso significa que você pode desenhar mais sprites por milissegundo e, assim, obter mais na tela.

Outras dicas

Toda vez que você alterna sua textura limitada atualmente, incorre em uma penalidade (às vezes muito grande se o sistema ficar sem memória e começar a pagar texturas dentro e fora). Portanto, quanto mais coisas você pode desenhar com uma textura, melhor. Indo para extremos, se você nunca mudou de ligação de textura, incorreria em uma penalidade.

Por outro lado, as placas de vídeo limitam o tamanho máximo de uma textura, para que você possa apenas agrupar tanto texturas menores em uma grande. Quanto mais antigo o cartão, menor o tamanho da textura você pode usar. Portanto, se você deseja fazer seu jogo funcionar em uma grande variedade de cartas, precisará limitar suas texturas a um tamanho mais normal (ou ter diferentes conjuntos de texturas para cartões diferentes).

Outro problema é que, às vezes, o material do seu mundo virtual simplesmente não se pertence a ser agrupado assim. Embora você possa ter uma textura grande a cada pequena decoração para sua interface (quadros de janela, botões, etc.), você terá mais dificuldade em usar uma única textura para diferentes inimigos, porque eles podem nem aparecer na tela na tela ao mesmo tempo, ou você pode não conseguir desenhá-los um após o outro por causa do esquema de desenho de volta à frente necessário para a transparência.

Há pouco tempo, um motivo para usar sprites embalados, em vez de separados, era que o hardware gráfico era limitado a texturas de duas (256, 512, 1024, ...). Então, você desperdiçaria uma boa quantidade de memória, não embalando os sprites, pois precisaria aumentar tudo para obter duas dimensões antes de poder enviá-lo. Embalando vários sprites em uma única textura funcionou em torno disso.

Outro motivo é que é muito mais rápido carregar um arquivo de imagem grande do HD do que carregar centenas de pequenas. Esse ainda é o caso, pois o acesso ao arquivo vem com uma sobrecarga bastante grande por arquivo; portanto, quanto menos arquivos você tiver as coisas mais rápidas. E especialmente com pequenos sprites, você pode facilmente transformar cem arquivos em um único, portanto a economia pode ser bastante perceptível.

No entanto, também há razão para ter tudo em uma textura. Para um OpenGL, não se limita mais a texturas de potência de duas, portanto, qualquer tamanho funcionará. Mais importante, porém, embalar tudo em uma textura tem efeitos colaterais negativos. Quando você, por exemplo, tiver muita escala em um jogo, deve ter cuidado com as fronteiras de seus sprites, pois as cores se combinam com os sprites vizinhos, dando artefatos feios. Você pode evitar isso até certo ponto, adicionando espaço extra ao redor de seus sprites, mas não é uma solução perfeita. Ter tudo em uma textura também limita o que você pode fazer com a imagem. Para certos efeitos, como uma cachoeira, por exemplo, você pode querer fazer a animação simplesmente compensando as coordenadas UV da textura, você não pode fazer isso com tanta facilidade quando tudo está embalado em uma única textura.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top