ios - para - ADVERTENCIA: Salida del sombreador de vértice ''v_gradient'' no leída por fragmento shader
xcode 9.3 download (2)
Cuando ejecuto mi aplicación en ios 10 con xcode 8, recibo el siguiente mensaje en la consola de depuración y, al congelar la interfaz de usuario, ¿alguien puede saber por qué sucede esto?
ERROR
/BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit/VectorKit-1228.30.7.17.9/GeoGL/GeoGL/GLCoreContext.cpp
1763: InfoLog SolidRibbonShader: ERROR
/BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit/VectorKit-1228.30.7.17.9/GeoGL/GeoGL/GLCoreContext.cpp
1764: WARNING: Output of vertex shader ''v_gradient'' not read by
fragment shader
Actualización: el problema parece haber desaparecido ahora en Xcode9 / iOS11.
En primer lugar, el problema de congelación ocurre solo cuando se ejecuta desde Xcode 8 y solo en iOS 10 (actualmente 10.0.2), ya sea en modo de depuración o lanzamiento. Aunque MKMapView parece estar bien cuando la aplicación se distribuye a través de App Store o sistemas de distribución ad hoc de terceros. Las advertencias que está viendo pueden o no estar relacionadas con el problema, no lo sé.
Lo que he encontrado es que el código ofensivo está en el destructor de MKMapView, y no importa lo que haga con el objeto de vista de mapa o cómo lo configure, es decir, simplemente llamando
[MKMapView new];
Cualquier lugar en tu código congelará la aplicación. El hilo principal cuelga de un semáforo y no está claro por qué.
Una de las cosas que he intentado fue destruir el objeto de vista de mapa en un hilo separado, pero eso no ayudó. Finalmente, decidí retener mis objetos de mapa al menos en las compilaciones DEBUG.
NOTA : esta es una solución muy sh * tty pero al menos le ayudará a depurar su aplicación sin congelar. Retener estos objetos significa que su uso de memoria aumentará en aproximadamente 45-50MB cada vez que cree un controlador de vista con un mapa.
Entonces, digamos que si tiene una propiedad mapView
, entonces puede hacer esto en el controlador de su vista:
- (void)dealloc
{
#if DEBUG
// Xcode8/iOS10 MKMapView bug workaround
static NSMutableArray* unusedObjects;
if (!unusedObjects)
unusedObjects = [NSMutableArray new];
[unusedObjects addObject:_mapView];
#endif
}
Responder
Una de las situaciones en las que puede recibir esta advertencia en Xcode es cuando utiliza una aplicación que usa sombreadores como la aplicación Mapas con un MKMapView
. Encontrará que la vista del mapa funciona como se espera sin esa advertencia en un dispositivo real con hardware real / SO nativo.
En la simulación, el sombreador de fragmentos de SolidRibbonShader
no puede leer la salida del v_gradient
vértice shader probablemente porque está en beta o puede haber una incompatibilidad entre la versión de Xcode y la versión de SIM. Sin embargo, los shaders son reconocidos en un dispositivo real.
Explicación
Esos sombreadores pertenecen a OpenGL Rendering Pipeline . La Línea de procesamiento es la secuencia de pasos que realiza OpenGL al representar objetos.
La canalización de procesamiento es responsable de cosas como la aplicación de texturas, la conversión de los vértices al sistema de coordenadas correcto y la visualización del carácter en la pantalla, etc.
Hay seis etapas en este oleoducto.
- Operación Per-Vértex
- Asamblea primitiva
- Procesamiento primitivo
- Rasterización
- Procesamiento de fragmentos
- Operación por fragmento
Finalmente, aparece una imagen en la pantalla de su dispositivo. Estas seis etapas se denominan OpenGL Rendering Pipeline y todos los datos utilizados para renderizar deben pasar por él.
¿Qué es un shader?
Un shader es un pequeño programa desarrollado por usted que vive en la GPU. Un shader está escrito en un lenguaje gráfico especial llamado OpenGL Shading Language (GLSL) .
Un shader toma el lugar de dos etapas importantes en el proceso de Procesamiento de Procesamiento de OpenGL: Procesamiento por Vértice y Procesamiento por Fragmento . Hay un sombreador para cada una de estas dos etapas.
El objetivo final de Vertex Shader
es proporcionar la transformación final de los vértices de malla a la tubería de representación. El objetivo del Fragment shader
es proporcionar datos de coloración y textura a cada píxel que se dirige al framebuffer.
Vertex shaders
transforman los vértices de un triángulo de un sistema de coordenadas del modelo local a la posición de la pantalla. Fragment shaders
calculan el color de un píxel dentro de un triángulo rasterizado en la pantalla.
Separar objetos de sombreado velocidad compilación y vinculación
Muchas aplicaciones de OpenGL ES usan varios sombreadores de vértices y fragmentos , y a menudo es útil reutilizar el mismo fragmento de sombreado con diferentes sombreadores de vértices o viceversa. Debido a que la especificación básica de OpenGL ES requiere que se vinculen un vértice y un sombreador de fragmentos en un solo programa de sombreado, la mezcla y la concordancia de los sombreadores da como resultado un gran número de programas, lo que aumenta la compilación total del sombreado y el tiempo de enlace al inicializar la aplicación.