2

目前,我使用 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);

问题是核心图形部分真的很慢,我需要设置和绘制核心图形只是为了提取图像数据......我不想在屏幕上显示它。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);
4

2 回答 2

1

如果您正在为 iOS 5 及更高版本进行开发,GLKTextureLoader那么您正在寻找的是:

于 2012-07-05T16:31:24.370 回答
1

GLKTextureLoader 比使用 CG 慢几个数量级。

我已将此记录为 Apple DTS 的错误,并将其退回为“是的,我们知道,不在乎,不会修复它。如果您希望快速加载纹理,则应该使用 CoreGraphics 代替” (几乎是那个措辞)

如果您将 CGContext* 方法为您创建/允许您传入的原始缓冲区提供给它,glTexImage2D 会非常快。当然,假设您获得了正确的 RGBA/ARGB/etc 色彩空间。

cgcontextDrawImage 也超级快。我的猜测是通过网络加载数据需要时间......

于 2013-09-02T20:25:38.107 回答