Estoy trabajando en un pequeño juego de PC basado en fichas / sprites con un equipo de personas, y nos encontramos con problemas de rendimiento. La última vez que utilicé OpenGL fue alrededor de 2004, así que me enseñé a mí mismo cómo usar el perfil central y me encuentro un poco confundido.
Necesito dibujar en el vecindario de 250-750 48x48 mosaicos en la pantalla en cada cuadro, así como quizás alrededor de 50 sprites. Las fichas solo cambian cuando se carga un nuevo nivel, y los sprites cambian todo el tiempo. Algunas de las fichas están formadas por cuatro piezas de 24x24, y la mayoría (pero no todas) de los sprites son del mismo tamaño que las fichas. Muchos de los azulejos y sprites usan la mezcla alfa.
En este momento estoy haciendo todo esto en modo inmediato, lo que sé que es una mala idea. De todos modos, cuando uno de los miembros de nuestro equipo intenta ejecutarlo, obtiene velocidades de cuadro muy malas (~ 20-30 fps), y es mucho peor cuando hay más mosaicos, especialmente cuando muchos de esos mosaicos son del tipo que Se cortan en pedazos. Todo esto me hace pensar que el problema es la cantidad de llamadas realizadas.
He pensado en algunas posibles soluciones para esto, pero quería dirigirlas por algunas personas que saben de lo que están hablando para que no pierda mi tiempo en algo estúpido:
Azulejos
- Cuando se carga un nivel, dibuje todas las fichas una vez en un búfer de cuadro unido a una textura de bocina grande, y simplemente dibuje un rectángulo grande con esa textura en cada cuadro.
- Coloque todos los mosaicos en un búfer de vértices estáticos cuando se cargue el nivel y dibuje de esa manera. No sé si hay una manera de dibujar objetos con diferentes texturas con una sola llamada a glDrawElements, o si esto es algo que quisiera hacer. ¿Tal vez solo coloque todos los mosaicos en una gran textura gigante y use coordenadas de textura divertidas en el VBO?
SPRITES:
- Dibuja cada sprite con una llamada separada a glDrawElements. Esto parece implicar una gran cantidad de cambio de textura, lo que me dicen que es malo. ¿Las matrices de texturas pueden ser útiles aquí?
- Use un VBO dinámico de alguna manera. La misma pregunta de textura que el número 2 anterior.
- Punto sprites? Esto es probablemente una tontería.
¿Alguna de estas ideas es sensata? ¿Hay una buena implementación en algún lugar que pueda mirar?