我正在渲染60张图像并收到内存警告。我的代码有更好的方法吗?
- (void)change{
for (int aniCount = 1; aniCount < 60; aniCount++) {
if ([UIScreen mainScreen].bounds.size.height == 568) {
self.renderString = [NSString stringWithFormat: @"%i_5.png", aniCount + 1];
self.imageView.image = [UIImage imageNamed:@"1_5.png"];
}else{
self.renderString = [NSString stringWithFormat: @"%i.png", aniCount + 1];
}
// here is the code to pre-render the image
UIImage *frameImage = [UIImage imageNamed:self.renderString];
UIGraphicsBeginImageContext(frameImage.size);
CGRect rect = CGRectMake(0, 0, frameImage.size.width, frameImage.size.height);
[frameImage drawInRect:rect];
UIImage *renderedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.menuanimationImages addObject:renderedImage];
}
self.imageView.animationImages = [NSArray arrayWithArray: self.menuanimationImages];
}
此方法在我的- (void)viewDidLoad
答案 0 :(得分:2)
我们是否从屏幕分辨率的检查中推断出这些是全屏图像?如果是这样,要制作一张包含60张图像的全屏动画需要非常大的内存,而且我不会惊讶于你会收到内存警告。每个图像在UIImageView
中使用时,每个像素至少需要四个字节。
对于4英寸屏幕上的非视网膜图像,60张全屏图像需要大约42mb。如果是视网膜图像(分辨率的两倍),则跳到166mb。不要看PNG的大小考虑使用的内存量时文件,因为PNG文件有一些压缩,但是当你在你的应用程序中使用它们时它们将被解压缩。
通常你不想动画使用那么多全屏图像。您可能希望使用UIKit动画或Core Animation(或其他类似技术)以编程方式为视图设置动画。或者,如果你真的必须使用一系列图像,看看你是否可以将动画部分约束到屏幕的一小部分,从而使用更小的图像并且需要更少的内存。
如果不知道动画的样子,很难说。如果您描述动画(或向我们展示一两个屏幕快照),我们可能会建议更少的内存密集型方法。
在您的评论中,您分享了link to a video,其中包含所需的千变万化效果。几点想法:
我首先关注的是以编程方式渲染千变万化的效果。考虑到这里的复杂性,这可能会让我研究“OpenGL ES”方法来渲染这种千变万化的效果。您甚至可能会对某些现有的实施进行操作。
我注意到CIKaleidoscope
和CITriangleKaleidoscope
的核心图像过滤器可能对生成您正在寻找的效果很有用(有关详细信息,请参阅Core Image Filter Reference那两个过滤器)。我不认为这些会在这里完全正确,但工作结束了。
如果没有上述尝试以编程方式呈现万花筒,那么至少,你可以将当前实现的内存需求降低四倍,因为万花筒效果似乎是水平和垂直对称。因此,理论上你可以为左上象限设置一系列图像,然后将其他三个图像渲染为同一图像的变换。
或者您可以创建全屏视频并使用media player framework进行播放。