CVOpenGLESTextureCacheCreateTextureFromImage en iPad2 es demasiado lento, necesita casi 30 ms, demasiado loco

Utilizo opengl es para mostrar datos de bgr24 en el iPad, soy nuevo en opengl es, por lo que en la parte de video en pantalla, uso el código de RosyWriter una muestra de APPLE. Funciona, pero la función CVOpenGLESTextureCacheCreateTextureFromImage cuesta más de 30 ms, mientras que en RosyWriter su costo es insignificante. lo que hago es primero transformar BGR24 en formato de píxel BGRA, luego usar la función CVPixelBufferCreateWithBytes crear un CVPixelBufferRef, y luego obtener un CVOpenGLESTextureRef por CVOpenGLESTextureCacheteCreateTextureFromImage. Mis códigos de la siguiente manera,

- (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);
}

y después de la transformación, generará CVPixelBufferRef, códigos como los siguientes,

[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;
}

Los otros códigos son casi similares a la muestra de RosyWriter, incluyen shaders. Así que quiero saber por qué, cómo solucionar este problema.

Respuestas a la pregunta(1)

Su respuesta a la pregunta