界面卡顿?
以前玩过flash的就知道,要使动画流畅,那么一秒最少需要24帧,因为人眼的反应时间是1/24秒.
在iOS上也是一样,iOS的帧数掉到24以下就会出现,所谓的卡顿现象.也有说是30帧以下,或者60帧以下.这里说的24帧只是理论上的.
网上的资料说,iOS开始就是双缓存+垂直同步,而Android从4.1起,开始使用三缓存+垂直同步.令人好奇的是,为什么Android的动画还是卡.这个可能就是硬件性能的短板以及本身Android这个系统的内在机制问题了(扯远了)..
双缓存很好理解,当前一帧画面,后台准备下一帧.(同理三缓存)
卡顿产生的原因就是,当前一帧(A帧)结束,而在缓存区的下一帧(B帧)又没有准备好时.缓存区里的那一帧(B帧)会被丢弃.显示屏会依旧显示之前那一帧(A帧).
这里引入一个垂直同步的概念,有兴趣搜索一下就明白了.
当一个垂直同步时间单位内,CPU和GPU没有将内容提交到缓存区,那么该帧就会被丢弃.也就是上面说的B帧的情况.
一帧的画面是由CPU和GPU共同处理得出的.
CPU:视图创建,布局计算,图片解码,文本绘制等.
GPU:变换,合成,渲染.
其实洒洒洋洋写了那么多,简单一句话来说,就是如果不涉及UI的操作,尽量放在后台线程去处理..
这里有个AsyncDisplayKit,看名字就知道了,异步显示库.它对UIkit进行的封装,替我们优化了,CPU和GPU在创建,计算,合成,渲染等的过程.
下面两个函数分别是AsyncDisplayKit创建显示一个图片和普通的创建显示图片.
-(void)creatWithASDK { dispatch_queue_t SelfQueue = dispatch_queue_create("COM.M1989.Queue", NULL); dispatch_async(SelfQueue, ^{ ASImageNode *ImgNote = [[ASImageNode alloc] init]; ImgNote.image = [UIImage imageNamed:@"cmd"]; ImgNote.frame = CGRectMake(10, 150, 200, 200); dispatch_async(dispatch_get_main_queue(), ^{ [self.view addSubview:ImgNote.view]; }); }); } -(void)creatWithNormal { UIImageView *img = [[UIImageView alloc] initWithFrame:CGRectMake(10, 360, 200, 200)]; img.image = [UIImage imageNamed:@"cmd"]; [self.view addSubview:img]; }
没有真机测试,打不开GPU Driver...