废话就不多说了,开始。。。
关于在App启动时播放一段动画,可以用flash直接播放,也可以用多张续连的图片来实现,在项目中,我选择了后者。
通过续连的多张图片做出动画效果,系统自带的UIImageView能就成完这个功能,一开始我也这么做的,但是最后发明内存爆了,占了800M多(iPAD)。(注:一张100K的png图片初始化为Image放到内存后会占用几M到几十M的间空不等)
最后我选择了通过准时器断不新刷UIImageView.image的方法。
在这里又被系统忽悠了一把。 [UIImgae imageName: ]和[UIImage imageWithContentsOfFile: ],这两个方法从理论上说,前者是系统分配一块内存缓存图片,并在app性命 周期内始终存在,而后者是时暂存于内存,过后就放释的。我用了后者,发明内存一样爆掉,乎似(确定)系统并没有放释内存。这个问题困扰了我半天,到底如何才能让系统实时放释这些间空,换个角度想可能更好,手动请申 —— 手动放释。
于是我换成了[UIImage alloc]initWIthContentsOfFile: ]方法,这样就胜利的决解掉了内存没法放释的问题。我的动画图片又106张,测试中发明只占了40-50M的间空,可以受接。
决解了内存问题,如何能让图片速快新刷就成了事不宜迟。
我建了个缓存池,台后异步取读图片到NSMutiableArray中,主线程从array中取获image并准时新刷到ImageView中。这个方法在多核备设中性能有所提高,动画更加畅流。
上面是心核代码:
- (void) precache { _cacheImages = TRUE; _cacheImageArray = [[NSMutableArray alloc]initWithCapacity:0]; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSLog(@"################################ image swap begin #########################"); UIImage * img = nil; for (int i =1; i < [_imageNames count]; i++) { if(_cacheImageArray.count <= KSwapImageNum) { NSString * name = [_imageNames objectAtIndex:i]; img = [[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:nil]]; [_cacheImageArray addObject:img]; [img release];img = nil; }else{ [_requestCondition lock]; [_requestCondition wait]; [_requestCondition unlock]; i--; } } NSLog(@"################################ image swap end #########################"); }); } - (void) setImageAtIndex:(NSInteger)index { _imageset = TRUE; NSString * name = [_imageNames objectAtIndex:index]; // load the image from the bundle UIImage * img = nil; if (_cacheImages) { if (_cacheImageArray.count > 0) { img = [_cacheImageArray objectAtIndex:0]; // set it into the view _imageView.image = nil; [_imageView setImage:img]; [_cacheImageArray removeObjectAtIndex:0]; if (_cacheImageArray.count <= KSwapImageMinNum) { [_requestCondition signal]; } img = nil; } } else { img = [[UIImage alloc]initWithContentsOfFile: [[NSBundle mainBundle] pathForResource:name ofType:nil]]; // set it into the view [_imageView setImage:img]; [img release];img = nil; } }
文章结束给大家分享下程序员的一些笑话语录: 火车
一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现 列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面是一个老奶 奶和一个年轻漂亮的姑娘。两个上前坐了下来。程序员和那个姑娘他们比较 暧昧地相互看对方。这时,火车进入山洞,车厢里一片漆黑。此时,只听见 一个亲嘴的声音,随后就听到一个响亮的巴掌声。很快火车出了山洞,他们 四个人都不说话。
那个老奶奶在喃喃道, “这个年轻小伙怎么这么无礼, 不过我很高兴我的孙女 扇了一个巴掌”。
项目经理在想,“没想到这个程序员居然这么大胆,敢去亲那姑娘,只可惜那 姑娘打错了人,居然给打了我。”
漂亮的姑娘想,“他亲了我真好,希望我的祖母没有打疼他”。
程序员坐在那里露出了笑容, “生活真好啊。 这一辈子能有几次机会可以在亲 一个美女的同时打项目经理一巴掌啊”