Estoy desarrollando un gran juego que transmite datos de nivel (incluidos sombreadores) a medida que avanzas por el mundo del juego. No quiero tener enganches en mi velocidad de fotogramas cuando los sombreadores se compilan/vinculan o la primera vez que se usan.¿Se puede precalentar un sombreador en un hilo de fondo con su propio contexto?
Tengo mi shader de compilación y vinculación trabajando en un hilo separado con su propio contexto open-gl. Pero no he podido lograr que el precalentamiento de los sombreadores funcione en el subproceso separado (para que no se produzca ningún impacto en el rendimiento cuando se usa por primera vez el sombreador).
El precalentamiento realmente no se menciona en ningún lugar en los documentos iOS o OpenGL. Sin embargo, se menciona en OpenGL ES Analyzer (uno de los instrumentos disponibles cuando se realiza un perfil desde xcode). En esta herramienta recibo una advertencia de "Shader Compiled Outside of Prewarming Phase" cada vez que se renderiza algo con un shader que no se ha utilizado para renderizar algo antes. El "Detalle ampliado" dice esto:
"OpenGL ES Analyzer detectó una compilación de sombreado que no forma parte de una fase de precalentamiento inicial. La compilación de sombreado puede ser una operación lenta. Para evitarlos, precaliente todos los sombreadores utilizados para la representación. Para ello, realice un pase de precalentamiento cuando la aplicación se inicie y ejecute una llamada de dibujo con cada uno de los programas de sombreado que se utilizarán, utilizando cualquier configuración de estado gl. El programa de sombreado se usará junto con Estados como combinación, máscara de color, lógica ops, multisamping, formatos de textura y estado de punto primitivo pueden afectar la compilación de sombreadores ".
El término "compilación" es un poco confuso aquí. Los sombreadores de vértices y fragmentos ya se han compilado y el programa se ha vinculado. Pero la primera vez que se renderiza algo con un determinado estado OpenGL, hace un poco más de trabajo en el sombreador para optimizarlo para ese estado, supongo.
Tengo un código para precalentar los sombreadores formando un triángulo de tamaño cero antes de su primer uso.
Si compilo, enlace y precalentamos los sombreadores en el hilo principal con el mismo contexto Open GLL que el renderizado normal, entonces funciona. Sin embargo, si lo hago en el hilo de fondo con su contexto Open GL separado, no funciona (aún recibe la advertencia del Analizador en el primer uso).
Entonces ... podría ser que precalentar un sombreador en un contexto separado no tenga ningún efecto en otros contextos. O podría ser que no tengo el mismo estado configurado en el contexto separado. Existe un gran potencial de Open GL state que podría necesitar ser configurado. Estoy usando un buffer de representación fuera de pantalla en el hilo de fondo para que pueda considerarse parte del estado.
¿Alguien ha tenido éxito al obtener precalentamiento trabajando en un hilo de fondo?
Gracias por los enlaces. Sabía que este problema también existía en PC. Estoy más interesado en la experiencia de esta gente en OpenGL ES. Si alguien ha hecho esto funcionar en iOS u otra plataforma OpenGL ES que sería genial saber. De lo contrario, tendré que recurrir al desarrollo de un sistema en el que precalcule todos los sombreadores que se pueden usar en un nivel y en el contexto en el que se usan, y luego precalentarlos durante la carga inicial. – Namaste
Enlace para Ati como caducado. Nuevo: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/ATI_OpenGL_Programming_and_Optimization_Guide.pdf –