ios objective-c iphone graphics opengl-es

ios - gpus_ReturnGuiltyForHardwareRestart Crash in



objective-c iphone (1)

Desde mi experiencia recibo este tipo de accidentes en estos casos:

  1. Llamando a la API de OpenGL cuando la aplicación está en estado UIApplicationStateBackground .
  2. Usando objetos (texturas, VBO, etc.) que se crearon en el contexto de OpenGL que tienen diferentes grupos de acciones. Esto puede suceder si no llama a [EAGLContext setCurrentContext: ..] antes de renderizar u otro trabajo con el objeto OpenGL.
  3. Geometría inválida. Por ejemplo, esto puede suceder si asigna un búfer de índice para el tamaño más grande que necesita. Rellénelo con algunos valores y luego intente renderizar con el tamaño que se usó en la asignación. A veces esto funciona (la cola del búfer se llena con 0, y no ves ningún fallo visual). A veces se bloquea (cuando la cola del búfer se llena con basura y hace referencia al punto que está fuera de los límites).

Espero que esto ayude de alguna manera.

PD: ¿Tal vez dices algo más de información sobre tu aplicación? Escribo una aplicación que representa mapas vectoriales en iOS y no tengo ningún problema con iOS 11 en este momento. La canalización de procesamiento es bastante simple. CADisplayLink llama a nuestra devolución de llamada en el hilo principal cuando podemos renderizar el siguiente fotograma. Cada vista con escena OpenGL puede tener varios contextos en segundo plano para cargar recursos en segundo plano (ofc tiene el mismo grupo compartido con el contexto principal).

Estoy EAGLContext presentRenderbuffer muchos fallos en EAGLContext presentRenderbuffer en iOS 11, pero solo en iPhone 6 / EAGLContext presentRenderbuffer y anteriores .

Según esta publicación , creo que ya hemos descartado los problemas relacionados con VBO reescribiendo todo para no usar VBO / VAO, pero el problema no se solucionó.

Hay algunas otras preguntas sobre SO acerca de esto, pero no hay solución. ¿Alguien más ha estado viendo el aumento en este choque y ha podido resolverlo?

TL; DR:

Esto es lo que sabemos hasta ahora:

  • El bloqueo es específico de iOS11, iPhone 5S / 6/6 +. No ocurre en 6S en adelante.
  • El núcleo de la pila OpenGL devuelve gpus_ReturnGuiltyForHardwareRestart
  • Ocurre cuando intentamos invocar [EAGLContext presentRenderbuffer] desde un CAEAGLLayer
  • No tenemos un repro.

Lo que hemos intentado hasta ahora:

  • Elimine cualquier referencia a VBO / VAO en nuestra pila de renderizado. No ayudo
  • Hemos intentado volver a escribir con una amplia gama de escenarios de dibujo (rotación, cambio de tamaño, fondo / primer plano). Sin suerte.
  • Por lo que podemos decir, no hay nada específico en nuestra lógica de aplicación entre la familia de iPhone 6 y la familia de iPhone 6S.

Algunas pistas (que podrían ser relevantes pero no necesariamente):

  • Sabemos que cuando el presentRenderBuffer se invoca fuera del subproceso principal y algunos CATransaction se producen al mismo tiempo en el subproceso principal, la tasa de fallos aumenta.
  • Cuando se invoca presentRenderBuffer en el hilo principal (junto con toda la línea de dibujo), la tasa de caída desciende ligeramente pero no drásticamente.
  • Una gran parte (~ 20%) de los bloqueos se produce cuando la capa sale de la pantalla y / o sale de la jerarquía de la vista.

Aquí está la traza de la pila:

libGPUSupportMercury.dylib gpus_ReturnGuiltyForHardwareRestart 1 AGXGLDriver gldUpdateDispatch 2 libGPUSupportMercury.dylib gpusSubmitDataBuffers 3 AGXGLDriver gldUpdateDispatch 4 GLEngine gliPresentViewES_Exec 5 OpenGLES -[EAGLContext presentRenderbuffer:]