Cuadro 'Capture GPU frame' para la aplicación iOS

Mi aplicación realiza varias operaciones de renderizado en el primer fotogtwig (estoy usando Metal, aunque creo que lo mismo se aplica a GLES). Por ejemplo, se convierte en destinos que se usan en frameworks posteriores, pero que no se actualizan después de eso. Estoy intentando depurar algunas llamadas de dibujar de estas operaciones de renderizado, y me gustaría utilizar la funcionalidad 'Marco de captura de GPU' para hacerlo. Lo he usado en el pasado para la debugging del marco de la GPU bajo demanda, y es muy útil.

Desafortunadamente, no puedo encontrar la forma de capturar el primer fotogtwig. Por ejemplo, esta opción no está disponible cuando se rompe en el depurador (configurando un punto de interrupción antes del primer cuadro). Los comportamientos de Xcode tampoco parecen permitir capturar el marco una vez que comienza la debugging. Tampoco parece que exista una API para realizar capturas de GPU, en API metálicas o CAMetalLayer.

¿Alguien ha hecho esto con éxito?

Me he encontrado con esto otra vez, y lo he entendido bien ahora. Agregaré esto como una respuesta separada, ya que es un enfoque completamente diferente de mi otra respuesta.

Primero, algunos antecedentes. Hay tres componentes para capturar un marco de GPU:

  1. Indicar a Xcode que desea capturar un cuadro de la GPU. En el uso documentado típico, lo hace manualmente haciendo clic en el button "camera" de captura de fotogtwigs de la GPU en Xcode .
  2. Indica el inicio del siguiente fotogtwig para capturar. Normalmente, esto ocurre en la próxima aparición de MTLCommandBuffer presentDrawable: que se invoca para presentar el framebuffer a la vista subyacente.
  3. Indica el final del fotogtwig capturado. Normalmente, esto ocurre en la próxima pero una sola vez de MTLCommandBuffer presentDrawable:

Al capturar el primer fotogtwig, o actividad antes del primer fotogtwig, solo el tercero está disponible, por lo que necesitamos una forma alternativa de realizar los dos primeros elementos:

  1. Para indicarle a Xcode que comience a capturar un fotogtwig, agregue un punto de interrupción en Xcode en una línea en su código en algún lugar antes del punto en el que desea comenzar a capturar un fotogtwig. Haga clic derecho en el punto de interrupción, select Editar punto de interrupción en el menu emergente y agregue una acción de Marco de GPU de captura al punto de interrupción:

    introduzca la descripción de la imagen aquí

  2. Para indicar el inicio del marco para capturar, antes de la primera aparición de MTLCommandBuffer presentDrawable: puede usar el método MTLCommandQueue insertDebugCaptureBoundary . Por ejemplo, podría invocar este método tan pronto como MTLCommandQueue instancia de MTLCommandQueue , para comenzar inmediatamente a capturar todo lo enviado a la queue. Asegúrese de que el punto de interrupción en el elemento 1 se dispare antes del punto en que se invoca este código.

  3. Para indicar el final de la ttwig capturada, puede confiar en la primera ocurrencia normal de MTLCommandBuffer presentDrawable: o puede agregar una segunda invocación de MTLCommandQueue insertDebugCaptureBoundary .

Finalmente, el método MTLCommandQueue insertDebugCaptureBoundary realidad no hace que se MTLCommandQueue insertDebugCaptureBoundary el marco. Simplemente marca un punto límite, por lo que puede dejarlo en su código para el futuro uso de debugging. Envuélvalo en una condicional de compilation DEBUG si quieres que se vaya del código de producción.

Tratar…

 [myMTLCommandEncoder insertDebugSignpost: @"com.apple.GPUTools.event.debug-frame"]. 

Para ser honesto, no lo he probado yo mismo, pero es análogo a lo similar

 glInsertEventMarkerEXT(0, "com.apple.GPUTools.event.debug-frame") 

documentado para OpenGL ES, y hay alguna mención en la web de que funciona para Metal.