界面卡顿?

以前玩过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...

posted @ 2016-03-02 11:02  NGI.  阅读(314)  评论(0编辑  收藏  举报
GitHub | M1989