Cómo acelerar la carga / compilación de shader en Android

He escrito un fondo de pantalla en vivo de OpenGL para Android que utiliza 17 píxeles y 17 sombreadores de vértices. En mi HTC Legend, estos toman unos 3 segundos para cargar y compilar. Tiempo de carga es de alrededor del 20% de esto, el resto es la compilación.

Un fondo de pantalla en vivo tiene su contexto OpenGL destruido cada vez que se ejecuta una aplicación a pantalla completa, y cuando el fondo vuelve a ser visible de nuevo, todos los shaders, texturas y así sucesivamente necesitan ser recargados, haciendo que la pantalla se congele durante 3 segundos cada vez, Que es inaceptable para mí 🙁

He hecho algo de lectura y al parecer, no es posible precompilar los shaders. ¿Qué más podría hacer para solucionar este problema? ¿Es posible cargar y compilar shaders en un hilo de fondo? Podría mostrar algún tipo de animación de progreso en ese caso. No sería genial, pero mejor que nada …

[EDIT1] Otra gran razón para acelerar esto es que todo el ciclo de vida basado en OpenGL Live Wallpaper es difícil de conseguir funcionar correctamente en todos los dispositivos (y eso es un eufemismo). Introducir tiempos de carga largos cada vez que el contexto se pierde / recrea agrega más dolores de cabeza de lo que quiero. De todas formas:

Como sugiero la respuesta 1, intenté mirar la extensión GL_OES_get_program_binary, para hacer algún tipo de compile-once-store-compilated-version-per-installed-app, pero estoy preocupado por la extensión de esta extensión. Por ejemplo, mi tableta alimentada con Tegra2 no parece apoyarla.

Otros enfoques que estoy considerando:

1) Ubershader: poner todos los shaders de píxeles en un gran shader, con un interruptor o si las declaraciones. ¿Esto disminuiría drásticamente el shader de píxeles? ¿Haría que el shader fuera demasiado grande y me invadiera todos esos importunos registros / conteo de instrucciones / límites de búsqueda de texturas? La misma idea para los sombreadores de vértice. Esto reduciría mi shadercount entero a 1 píxel y 1 sombreador de vértice, y espero que compilar / enlazar lotes más rápido. ¿Alguien ha intentado esto? [EDIT2] Acabo de probar esto. No lo hagas. Compilación / vinculación ahora tarda 8 segundos antes de darse por vencido con un vago "error de enlace" error 🙁

2) Carga de fondo del hombre pobre: ​​no cargue / compile los shaders al principio, sino cargue / compile una actualización de sombreado por fotograma para los primeros 17 cuadros. Al menos estaría refrescando la pantalla, y podría mostrar una barra de progreso para hacer que el usuario vea que algo está sucediendo. Esto funcionaría bien en los dispositivos lentos, pero en los dispositivos rápidos esto probablemente haría que todo el shader carga / compile la fase más lenta de lo que necesita ser …

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.