CVOpenGLESTextureCacheCreateTextureFromImage no iPad2 é muito lento, precisa de quase 30 ms, muito louco
Eu uso opengl es para exibir dados bgr24 no iPad, eu sou novo sobre opengl es, portanto, na parte de vídeo de exibição eu uso código de RosyWriter uma amostra de APPLE. Ele funciona, mas a função CVOpenGLESTextureCacheCreateTextureFromImage custa mais de 30ms, enquanto no RosyWriter seu custo é insignificante. O que eu faço é transformar primeiro o formato de pixel BGR24 para BGRA, em seguida, usar a função CVPixelBufferCreateWithBytes criar um CVPixelBufferRef e, em seguida, obter um CVOpenGLESTextureRef por CVOpenGLESTextureCacheCreateTextureFromImage. Meus códigos como seguindo,
- (void)transformBGRToBGRA:(const UInt8 *)pict width:(int)width height:(int)height
{
rgb.data = (void *)pict;
vImage_Error error = vImageConvert_RGB888toARGB8888(&rgb,NULL,0,&argb,NO,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImageConvert_RGB888toARGB8888 error");
}
const uint8_t permuteMap[4] = {1,2,3,0};
error = vImagePermuteChannels_ARGB8888(&argb,&bgra,permuteMap,kvImageNoFlags);
if (error != kvImageNoError) {
NSLog(@"vImagePermuteChannels_ARGB8888 error");
}
free((void *)pict);
}
e depois da transformação, irá gerar CVPixelBufferRef, códigos da seguinte forma,
[self transformBGRToBGRA:pict width:width height:height];
CVPixelBufferRef pixelBuffer;
CVReturn err = CVPixelBufferCreateWithBytes(NULL,
width,
height,
kCVPixelFormatType_32BGRA,
(void*)bgraData,
bytesByRow,
NULL,
0,
NULL,
&pixelBuffer);
if(!pixelBuffer || err)
{
NSLog(@"CVPixelBufferCreateWithBytes failed (error: %d)", err);
return;
}
CVOpenGLESTextureRef texture = NULL;
err = CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault,
videoTextureCache,
pixelBuffer,
NULL,
GL_TEXTURE_2D,
GL_RGBA,
width,
height,
GL_BGRA,
GL_UNSIGNED_BYTE,
0,
&texture);
if (!texture || err) {
NSLog(@"CVOpenGLESTextureCacheCreateTextureFromImage failed (error: %d)", err);
CVPixelBufferRelease(pixelBuffer);
return;
}
Os outros códigos são quase similares. Exemplos de RosyWriter incluem shaders. Então eu quero saber porque, como corrigir esse problema.