我无法弄清楚为什么使用GCContext绘制/合并两个以上的UII图像,使用它 很多记忆。我启用了ARC,在查看我的程序内存使用情况时(使用VM Tracker工具)我看到下面的第一个解决方案仅使用两个映像的内存(大约16 MB DirtySize和80 MB ResidentSize),而绘制CGContext使用我所有UIImages的内存量(约468 MB DirtySize和520 MB ResidentSize)最终导致我的应用程序崩溃。 如何确保CGContext的使用量不超过用于的内存量 两个UIImages? 实际上,我喜欢完成一种双缓冲,用于绘制具有最小内存要求和最佳性能的相同大小的图像文件(基于.PNG并且已经具有透明设置)的多个层。
请注意,我的ViewController包含'UIImageView * imageView'和'CGSize imageSize' 属性。
以下代码仅用于检查加载UIImages所消耗的内存量:
- (void)drawUsingTwoUIImages1:(NSMutableArray *)imageFiles
{
if ( ! imageFiles.count ) {
return;
}
NSString *imageFile1 = [imageFiles objectAtIndex:0];
NSString *filePath1 = [[NSBundle mainBundle] pathForResource:imageFile1 ofType:nil];
UIImage *image1 = [UIImage imageWithContentsOfFile:filePath1];
UIImage *image2 = nil;
image1 = [UIImage imageWithContentsOfFile:filePath1];
for (NSInteger index = 1; index < imageFiles.count; index++) {
NSString *imageFile2 = [imageFiles objectAtIndex:index];
NSString *filePath2 = [[NSBundle mainBundle] pathForResource:imageFile2 ofType:nil];
image2 = [UIImage imageWithContentsOfFile:filePath2];
}
}
下一个代码我想在我的最终应用程序中使用,以显示所有绘制的imageFiles。我怀疑一些聪明的技巧需要按照CGContext处理的顺序进行,或者可能是CGLayerRef。如果有人能告诉我如何做到这一点,或想出工作 我将再次编码避难所了!
- (void)drawUsingTwoUIImages2:(NSMutableArray *)imageFiles
{
_imageView.image = nil;
if ( ! imageFiles.count ) {
return;
}
NSString *imageFile1 = [imageFiles objectAtIndex:0];
NSString *filePath1 = [[NSBundle mainBundle] pathForResource:imageFile1 ofType:nil];
UIImage *image1 = [UIImage imageWithContentsOfFile:filePath1];
UIImage *image2 = nil;
for (NSInteger index = 1; index < imageFiles.count; index++) {
if ( ! UIGraphicsGetCurrentContext() ) {
UIGraphicsBeginImageContext(_imageSize);
}
NSString *imageFile2 = [imageFiles objectAtIndex:index];
NSString *filePath2 = [[NSBundle mainBundle] pathForResource:imageFile2 ofType:nil];
image2 = [UIImage imageWithContentsOfFile:filePath2];
[image1 drawAtPoint:CGPointMake(0., 0.)];
[image2 drawAtPoint:CGPointMake(0., 0.)];
image1 = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
_imageView.image = image1;
}
以上真的让我疯狂,有没有人在这里看到我缺少的东西,或者知道如何才能获得最大的性能和最少的内存使用量?!
答案 0 :(得分:1)
我已经知道要走的路是使用CATiledLayer,并且需要在不同的比例尺寸中平铺你的图像数据。在Apple的示例代码中挖掘并在StackOverflow中搜索帮助我解决了这个问题。