Cómo actualizar píxeles directamente: con CGImage y CGDataProvider directo

Pregunta actual

Varias respuestas resolverán mi problema:

Puedo forzar unCGImage para recargar sus datos de un proveedor de datos directo (creado conCGDataProviderCreateDirect) me gustaCGContextDrawImage ¿hace? ¿O hay alguna otra forma en la que puedo configurarme en self.layer.contents para hacerlo?Hay unCGContext configuración o truco que puedo usar para renderizar imágenes de 1024x768 al menos 30 fps de forma consistente conCGContextDrawImage.¿Alguien ha sido capaz de usar con éxito?CVOpenGLESTextureCacheCreateTextureFromImage ¿Para actualizaciones de búfer en tiempo real con sus propios datos de textura? Creo que mi mayor problema es crear unCVImageBuffer como copié las otras propiedades de la documentación de Apple para las texturas. Si alguien tiene más información sobre esto, sería genial.Cualquier otra guía sobre cómo puedo obtener una imagen de la memoria en la pantalla a 30 fps.

Fondo (lotes):

Estoy trabajando en un proyecto donde necesito modificar los píxeles de los datos de imagen NPOT en tiempo real (mínimo de 30 fps) y dibujarlos en la pantalla en iOS.

Mi primer pensamiento fue usar OpenGL conglTexSubimage2D para actualizar, desafortunadamente eso terminó siendo muy lento (6 fps en el iPad) ya que el controlador se enciende y convierte mis datos RGB en cada cuadro a BGR. Así que envíalo en BGR, dices, y yo también, pero por alguna razón no puedes llamarglTexSubImage2D conGL_BGR Imagínate. Sé que cierta lentitud se debe a que no tiene poder para datos de 2 imágenes, pero mis requisitos lo dictan.

Más lectura me llevó aCVOpenGLESTextureCacheCreateTextureFromImage Pero todos los ejemplos son de ello utilizando la entrada de cámara directa para obtener unaCVImageBufferRef Intenté usar la documentación (no oficial pero solo los comentarios del encabezado) para hacer que mi propio CVImageBuffer formara mis datos de imagen, pero no funcionaría con esto (no hay errores, solo una textura vacía en el depurador), lo que me hace pensar que Apple lo construyó específicamente para procesar datos de cámara en tiempo real y no se ha probado mucho fuera de esta área, pero IDK.

De todos modos, después de renunciar a mi dignidad abandonando OpenGL y cambiando mis pensamientos a CoreGraphics, fui conducido a esta pregunta.La forma más rápida de dibujar un búfer de pantalla en el iPhone que recomienda usar unCGImage respaldado porCGDataProviderCreateDirect, que le permite devolver un puntero a los datos de imagen cuando CGImage lo necesita, ¿verdad? Bueno, no parece funcionar tan bien como lo anuncian. Si yo usoCGContextDrawImage entonces todo funciona. Puedo modificar el búfer de píxeles, y cada dibujo, solicita los datos de imagen de mi proveedor de datos como debería, llamando a los métodos enCGDataProviderDirectCallbacks (Note: parece que tienen una optimización incorporada que ignora el puntero actualizado si tiene la misma dirección que la anterior. CGContextDrawImage no es súper rápido (alrededor de 18 fps), incluso con la interpolación inhabilitadora, lo que lo elevó de 6 fps. Los documentos de Apple me dicen usandoself.layer.contents será mucho más rápido queCGContextDrawImage. Utilizandoself.layer.contents trabaja para la primera tarea pero laCGImage Nunca solicita una recarga del proveedor de datos como elCGContextDrawImage lo hace, incluso cuando llamo[layer setNeedsDisplay]. En la pregunta SO a la que hice referencia, el usuario muestra su solución al problema creando y destruyendo una nueva imagen CG desde la fuente de datos en cada fotograma, un proceso lento sin remedio (sí lo intenté), así que es hora de la pregunta real.

Nota: He perfilado todas estas operaciones y sé que el problema realmente esglTexSubImage para OpenGL yCGContextDrawImage Realmente es el problema de CoreGraphics, por lo que no hay respuestas de "ir al perfil".

EDITAR El código fuente que demuestra esta técnica ahora se puede encontrar enhttp://github.com/narpas/image-sequence-streaming

Respuestas a la pregunta(1)

Su respuesta a la pregunta