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, включают шейдеры. Итак, я хочу знать, почему, как решить эту проблему.