2011-09-07 6 views
5

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?

Respuesta

2

su código es (casi) perfectamente seguro. Los uniformes no son un problema ya que contienen algunos valores predeterminados. En cuanto a los atributos, tampoco es un problema ya que no está emitiendo ningún vértice.

Por otro lado, esta puede ser la forma más fácil de precalentar los shaders, pero puede no ser la mejor. Se usaron técnicas similares a la vez para precalentar texturas (para llenar el caché de texturas). Por lo general, se hacía renderizando algunos fotogramas sin mostrar la salida. Esto se vio, por ejemplo, en Unreal Tournament, que mostró "Precaching" durante un tiempo breve después de cargar el nivel. Sugeriría hacer lo mismo.

+0

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 –

+0

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 ... –

Cuestiones relacionadas