Estou trabalhando em um pequeno jogo de PC baseado em blocos / sprites com uma equipe de pessoas e estamos enfrentando problemas de desempenho. A última vez que usei o OpenGL foi por volta de 2004, por isso tenho me ensinado a usar o perfil principal e estou um pouco confuso.
Preciso desenhar 250-750 telhas 48x48 na tela a cada quadro, bem como talvez cerca de 50 sprites. As peças só mudam quando um novo nível é carregado e os sprites mudam o tempo todo. Algumas das peças são compostas por quatro peças 24x24, e a maioria (mas não todas) dos sprites é do mesmo tamanho das peças. Muitas peças e sprites usam mistura alfa.
No momento, estou fazendo tudo isso no modo imediato, o que sei ser uma má ideia. Mesmo assim, quando um dos membros de nossa equipe tenta executá-lo, ele obtém taxas de quadros muito ruins (~ 20-30 fps), e é muito pior quando há mais peças, especialmente quando muitas delas são do tipo que são cortados em pedaços. Isso tudo me faz pensar que o problema é o número de chamadas efetuadas.
Pensei em algumas soluções possíveis para isso, mas queria executá-las por algumas pessoas que sabem do que estão falando, para não perder meu tempo com algo estúpido:
AZULEJOS:
- Quando um nível é carregado, desenhe todas as peças uma vez em um buffer de quadro anexado a uma grande textura de buzina e apenas desenhe um grande retângulo com essa textura em cada quadro.
- Coloque todos os blocos em um buffer de vértice estático quando o nível for carregado e desenhe-os dessa maneira. Não sei se há uma maneira de desenhar objetos com diferentes texturas com uma única chamada para glDrawElements, ou se isso é algo que eu gostaria de fazer. Talvez apenas coloque todas as peças em uma grande textura gigante e use coordenadas de textura engraçadas na VBO?
SPRITES:
- Desenhe cada sprite com uma chamada separada para glDrawElements. Isso parece envolver muita troca de textura, o que me disseram que é ruim. As matrizes de textura podem ser úteis aqui?
- Use um VBO dinâmico de alguma forma. Mesma pergunta de textura que o número 2 acima.
- Sprites de ponto? Provavelmente isso é bobagem.
Alguma dessas idéias é sensata? Existe uma boa implementação em algum lugar em que eu possa examinar?