Estou desenvolvendo um jogo 2D e tenho muitos sprites. Eu usei animações e modelos 3D para renderizar em 2D, para dar a eles que "Fallout" ou "Diablo" olhem para eles. Também é mais fácil do que desenhar à mão, lol.
Eu já tive que reduzir a taxa de quadros para 15 fps, que foi a menor que eu pude diminuir sem fazer com que eles tivessem uma aparência instável. No entanto, foi triste devido à aparência incrivelmente suave de 24 quadros.
Há duas razões pelas quais fiz isso:
1) Reduza o espaço no disco rígido. Quanto menos imagens, menor será o meu jogo total.
2) Reduza o consumo de RAM. Quanto menos imagens forem carregadas, maior a probabilidade de evitar problemas que limitam minha limitação de RAM.
No entanto, se houvesse uma maneira de compactar as imagens no espaço do disco rígido e na RAM, eu o faria. Eu testei isso antes, e a maioria não recebe nenhuma alteração na qualidade ao passar de RGBA8888 para RGBA5555 e apenas um pequeno golpe ao converter para RGBA4444 no meu programa TexturePacker. No momento, não faço isso porque o SFML parece usar a mesma quantidade de memória, independentemente do tipo de imagem .PNG. Eu pesquisei sobre como carregá-lo de maneira diferente, mas não consegui encontrar nada sobre o assunto.
Eu li muito sobre como lidar com videogames 2D. O consenso é esmagador: coloque seus Sprites em uma textura maior para obter um ótimo desempenho! Então, eu agrupo meus pequenos sprites em uma planilha muito maior usando o TexturePacker.
No entanto, pretendo ter 10 a 15 animações por personagem, 5 direções para mover e 15 a 40 quadros por animação (provavelmente uma média de 24). Com 15 animações, 5 direções e uma média de 24 quadros por animação; Isso significa 1800 quadros individuais por personagem. Se embalado em uma folha de sprite, são apenas 75 imagens. (Uma folha de sprite por animação, por direção. 15 * 5)
Para o grande personagem chefe do jogo, não posso usar uma planilha e preciso programar uma maneira de simplesmente carregar uma imagem de cada vez. Ainda não sei se posso fazer isso por desempenho.
Para os personagens, eu já os coloco em uma planilha. Para um único personagem andando, isso parece funcionar na maioria das vezes, embora às vezes pare. No entanto, atribuo isso ao meu código mal concebido que troca as texturas em vez de pré-carregar todas as texturas para esse personagem.
Se eu fosse pré-carregar as texturas, faz sentido para folhas de sprite. Imagino que seja uma má ideia pré-carregar 1800 pequenas imagens para cada personagem.
No entanto, imagino que transmiti-los para dentro e para fora da memória, um de cada vez, seria extremamente rápido, portanto, eu só precisaria ter uma única imagem na memória de cada vez. Isso não significaria que, em um determinado momento, cada personagem consumisse apenas alguns KB em vez de 45 + MB?
Eu imagino que isso prejudicaria meu desempenho, pois o streaming precisaria ser incrivelmente rápido (15 imagens entrando e saindo da memória e renderizando por segundo) e, embora as imagens fossem muito pequenas, seria uma idéia melhor carregar planilhas de caracteres na memória. Mas terei que codificar um sistema de renderização semelhante a um fluxo de imagem única para meu personagem maior, de qualquer maneira.
Eu tenho experimentado, mas não é um processo simples. Especialmente porque estou trabalhando em outras partes do mecanismo de jogo que não lidam com gráficos no momento.