Ejecuto la herramienta de análisis OpenGL ES de Instruments en mi aplicación, y decía que después de compilar el sombreador, debería hacer una llamada a glDrawArrays en un pase de precalentamiento. Así que verifiqué el tiempo de algunos sombreadores que escribí, y de hecho la primera vez que el programa lo ejecuta es mucho más lento.¿Cómo arreglar el retraso en el primer uso de un sombreador?
En mi código que tienen un cargador de sombreado genérico, que no conoce los uniformes de sombreado/atributos, que acaba de compilar. Y parece que el mejor lugar para precalentar el sombreador está allí (así que no necesito agregar glDrawArrays en todas partes). He probado la adición de esto en mi cargador de shader:
glUseProgram(prog);
glDrawArrays(GL_TRIANGLES, 0, 0);
Se fija el retraso, pero como yo no estoy dando ningún uniformes/atributos No estoy seguro de si es seguro. También de alguna manera parece una solución. ¿Cuál es la mejor manera de precalentar el programa?
Excelente información, aunque esta es la primera vez que leo acerca del precalentamiento de shaders. ¿Tienes literatura sobre eso? Sería de gran ayuda. Saludos –
Bueno, porque todos los detalles de implementación relacionados con la GPU son específicos del proveedor y en su mayoría confidencial, yo diría que no hay ninguna pieza sólida de información sobre ese (porque nadie sabe realmente y siempre cambia). Pero los conceptos siguen siendo los mismos, si hay un recurso que se almacena en caché o se carga de forma perezosa, solo renderice unos pocos cuadros para llenar el caché y hacer que el recurso se cargue. No hay mucho más ... –