CVOpenGLESTextureCacheCreateTextureFromImage на iPad2 слишком медленный, ему нужно почти 30 мс, слишком сумасшедший

Я использую OpenGLES для отображения данных bgr24 на iPad, я новичок в OpenGLES, поэтому в части видео для отображения я использую код из RosyWriter один пример APPLE. Это работает, но функция CVOpenGLESTextureCacheCreateTextureFromImage стоит более 30 мс, в то время как в RosyWriter его стоимость ничтожна. Сначала я преобразую BGR24 в формат пикселей BGRA, затем с помощью функции CVPixelBufferCreateWithBytes создайте CVPixelBufferRef, а затем получите CVOpenGLESTextureRef с помощью CVOpenGLESTextureCacheCreateTextureFromImage. Мои коды как следующие,

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

и после преобразования сгенерирует CVPixelBufferRef, коды будут следующими:

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

Остальные коды практически аналогичны образцу RosyWriter, включают шейдеры. Итак, я хочу знать, почему, как решить эту проблему.

Ответы на вопрос(1)

Ваш ответ на вопрос