CVOpenGLESTextureCacheCreateTextureFromImage auf iPad2 ist zu langsam, es dauert fast 30 ms, zu verrückt
Ich verwende opengles, um bgr24-Daten auf dem iPad anzuzeigen, ich bin neu in opengles, also verwende ich im Anzeigevideoteil Code von RosyWriter, ein APPLE-Beispiel. Es funktioniert, aber die CVOpenGLESTextureCacheCreateTextureFromImage-Funktion kostet mehr als 30 ms, während die Kosten in RosyWriter vernachlässigbar sind. Ich transformiere zuerst BGR24 in das BGRA-Pixelformat, erst dann erstelle mithilfe der CVPixelBufferCreateWithBytes-Funktion ein CVPixelBufferRef und erhalte dann ein CVOpenGLESTextureRef von CVOpenGLESTextureCacheCreateTextureFromImage. Meine Codes wie folgt,
- (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);
}
und nach der Transformation wird CVPixelBufferRef wie folgt generiert:
[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;
}
Der andere Code ist dem RosyWriter-Beispiel fast ähnlich, einschließlich Shader. Ich möchte wissen, warum und wie ich dieses Problem beheben kann.