【发布时间】:2010-10-18 22:43:00
【问题描述】:
我正在尝试编写一个 iPhone 应用程序,该应用程序采用 PNG 瓦片集并在屏幕上显示它们的片段,并且我试图让它以 20fps 的速度刷新整个屏幕。目前我在模拟器上管理大约 3 或 4fps,在设备(iPhone 3G)上管理 0.5 - 2fps,具体取决于屏幕上的内容。
我目前正在使用 Core Graphics,目前正在尝试寻找避免硬着头皮在 OpenGL 中进行重构的方法。我已经对代码进行了 Shark 时间曲线分析,大约 70-80% 发生的所有事情都归结为一个名为 copyImageBlockSetPNG 的函数,该函数是从 CGContextDrawImage 内部调用的,它本身正在调用各种其他函数名称中的PNG。通货膨胀也在那里,占其中的 37%。
问题是,我已经将图像从 UIImage 加载到内存中,那么为什么代码仍然在乎它是 PNG?它不会在加载时解压缩为本机未压缩格式吗?我可以自己转换吗?分析表明,每次我从图像中绘制一个部分时,它都会对图像进行解压缩,最终是每帧 30 次或更多次。
解决方案
-(CGImageRef)inflate:(CGImageRef)compressedImage
{
size_t width = CGImageGetWidth(compressedImage);
size_t height = CGImageGetHeight(compressedImage);
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
int bitmapByteCount;
int bitmapBytesPerRow;
bitmapBytesPerRow = (width * 4);
bitmapByteCount = (bitmapBytesPerRow * height);
colorSpace = CGColorSpaceCreateDeviceRGB();
context = CGBitmapContextCreate (NULL,
width,
height,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease( colorSpace );
CGContextDrawImage(context, CGRectMake(0, 0, width, height), compressedImage);
CGImageRef result = CGBitmapContextCreateImage(context);
CFRelease(context);
return result;
}
它基于 zneak 的代码(所以他得到了大勾号),但我已经将一些参数更改为 CGBitmapContextCreate 以防止它在我输入我的 PNG 图像时崩溃。
【问题讨论】:
标签: iphone objective-c core-graphics