CVOpenGLESTextureCacheCreateTextureFromImage na iPad2 jest zbyt wolny, potrzebuje prawie 30 ms, zbyt szalony
Używam opengl es do wyświetlania danych bgr24 na iPadzie, jestem nowy w opengl es, więc w części wideo na ekranie używam kodu z jednej próbki APPLE RosyWriter. Działa, ale funkcja CVOpenGLESTextureCacheCreateTextureFromImage kosztuje ponad 30 ms, podczas gdy w RosyWriter jego koszt jest znikomy. to, co robię, to najpierw przekształcić BGR24 w format pikseli BGRA, a następnie użyć funkcji CVPixelBufferCreateWithBytes utworzyć CVPixelBufferRef, a następnie uzyskać CVOpenGLESTextureRef przez CVOpenGLESTextureCacheCreateTextureFromImage. Moje kody jak poniżej,
- (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);
}
a po transformacji wygeneruje CVPixelBufferRef, kody jak poniżej,
[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;
}
Pozostałe kody są prawie podobne do próbki RosyWriter, obejmują shadery. Chcę więc wiedzieć, dlaczego, jak rozwiązać ten problem.