目前我使用Image I / O在iOS中加载纹理,并使用Core Graphics提取其图像数据。然后我可以将图像数据发送到OpenGL,如下所示:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture->width, texture->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture->imageData);
问题是Core Graphics部分非常慢,我需要设置和绘制Core Graphics只是为了提取图像数据......我不想在屏幕上显示它。在iOS中提取图像数据必须有更有效的方法吗?...
这是我的代码:
...
myTexRef = CGImageSourceCreateWithURL((__bridge CFURLRef)url, myOptions);
...
MyTexture2D* texture;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
void *imageData = malloc( tileSize.width * tileSize.height * 4 );
CGContextRef imgContext = CGBitmapContextCreate( imageData, tileSize.width, tileSize.height, 8, 4 * tileSize.width, colorSpace, kCGImageAlphaNoneSkipLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease( colorSpace );
CGContextClearRect( imgContext, CGRectMake( 0, 0, tileSize.width, tileSize.height ) );
CGContextTranslateCTM( imgContext, 0, 0 );
...
CGImageRef tiledImage = CGImageCreateWithImageInRect (imageRef, tileArea);
CGRect drawRect = CGRectMake(0, 0, tileSize.width, tileSize.height);
// *** THIS CALL IS REALLY EXPENSIVE!
CGContextDrawImage(imgContext, drawRect, tiledImage);
CGImageRelease(tiledImage);
// TamTexture2D takes the ownership of imageData and will be responsible to free it
texture = new MyTexture2D(tileSize.width, tileSize.height, imageData);
CGContextRelease(imgContext);
答案 0 :(得分:1)
如果您正在为iOS 5及更高版本开发,GLKTextureLoader
是您正在寻找的内容:
答案 1 :(得分:1)
GLKTextureLoader比使用CG慢几个数量级。
我已将此记录为Apple DTS的一个错误,然后将其重新调整为#34;是的,我们知道,不在乎,不会修复它。如果你想快速加载纹理,你应该使用CoreGraphics" (几乎是那个措辞)
glTexImage2D非常快,如果你给它CGContext *方法为你创建的原始缓冲区/允许你传入。当然假设你得到RGBA / ARGB / etc颜色空间正确。
cgcontextDrawImage也非常快。我的猜测是,它花时间在网上加载你的数据......