Como atualizar diretamente pixels - com CGImage e direto CGDataProvider

Pergunta real

Várias respostas vão resolver o meu problema:

Posso forçar umCGImage para recarregar seus dados de um provedor de dados direto (criado comCGDataProviderCreateDirect) gostarCGContextDrawImage faz? Ou existe alguma outra maneira que eu possa definir para self.layer.contents para fazer isso?Tem algumaCGContext configuração, ou truque que eu posso usar para processar imagens 1024x768 pelo menos 30 fps consistentemente comCGContextDrawImage.Alguém foi capaz de usar com sucessoCVOpenGLESTextureCacheCreateTextureFromImage para atualizações de buffer em tempo real com seus próprios dados de textura? Eu acho que meu maior problema é criar umCVImageBuffer copiei as outras propriedades da documentação da Apple para texturas. Se alguém tiver mais alguma informação sobre isso, seria incrível.Quaisquer outras orientações sobre como posso obter uma imagem da memória na tela a 30 qps.

Fundo (lotes):

Eu estou trabalhando em um projeto onde eu preciso modificar os pixels de dados de imagem NPOT em tempo real (mínimo de 30 qps) e desenhar isso na tela do iOS.

Meu primeiro pensamento foi usar o OpenGL comglTexSubimage2D para atualizar, infelizmente, que acabou sendo muito lento (6 fps no iPad) como o driver swize e converte meus dados RGB cada quadro para BGR. Então envie-o em BGR você diz, e eu também, mas por algum motivo você não pode ligarglTexSubImage2D comGL_BGR vai saber. Eu sei que alguma lentidão é por causa do poder de 2 dados de imagem, mas meus requisitos ditam isso.

Mais leitura me levou aCVOpenGLESTextureCacheCreateTextureFromImage mas todos os exemplos são dele usando a entrada direta da câmera para obter umCVImageBufferRef Eu tentei usar a documentação (nenhum oficial ainda apenas comentários de cabeçalho) para fazer o meu próprio CVImageBuffer formar meus dados de imagem, mas não iria funcionar com isso (sem erros apenas uma textura vazia no depurador), o que me faz pensar que a Apple construiu especificamente para processar dados da câmera em tempo real e não foi testado muito fora dessa área, mas IDK.

De qualquer forma, depois de desistir da minha dignidade jogando o OpenGL e mudando meus pensamentos para o CoreGraphics, fui levado a essa questão.maneira mais rápida de desenhar um buffer de tela no iphone que recomenda usar umCGImage apoiado porCGDataProviderCreateDirect, que permite retornar um ponteiro para dados de imagem quando o CGImage precisar, certo? Bem, não parece funcionar como anunciado. Se eu usarCGContextDrawImage então tudo funciona. Eu posso modificar o buffer de pixel e, a cada sorteio, ele solicita os dados da imagem do meu provedor de dados como deveria, chamando os métodosCGDataProviderDirectCallbacks (Note: eles parecem ter uma otimização incorporada e ignoram o ponteiro atualizado se ele tiver o mesmo endereço que o anterior). CGContextDrawImage não é super rápido (cerca de 18 fps), mesmo com a interpolação de desabilitação, que trouxe isso de 6 fps. Docs da Apple me diz usandoself.layer.contents será muito mais rápido queCGContextDrawImage. Usandoself.layer.contents trabalha para a primeira missão, mas oCGImage nunca solicita uma recarga do provedor de dados como oCGContextDrawImage faz, mesmo quando eu chamo[layer setNeedsDisplay]. Na pergunta SO que fiz referencia, o usuário mostra sua solução para o problema criando e destruindo um novo CGImage da fonte de dados a cada quadro, um processo irremediavelmente lento (sim, tentei), então é hora da verdadeira questão.

Nota: Eu analisei todas essas operações e sei que o problema é realmenteglTexSubImage para OpenGL eCGContextDrawImage é realmente o problema do CoreGraphics, então não há "ir perfil" respostas.

EDITAR Código-fonte demonstrando essa técnica agora pode ser encontrado emhttp://github.com/narpas/image-sequence-streaming

questionAnswers(1)

yourAnswerToTheQuestion