TextureiOS底层探究

AsyncDisplayKit(Texture)的优化原理

2018-04-28  本文已影响142人  conowen

简介

AsyncDisplayKit是一个UI优化框架,现已改名为Texture
AsyncDisplayKit的基本单元是node,简单来说ASDisplayNode是一个对UIView的抽象,也可以说是对CALayer的一个抽象。因为UIView其实只是CALayer的delegate。UIView只能在主线程上使用,但是ASDisplayNode则不同,它是线程安全的,你可以在子线程中完成实例化与配置等。

为了保持用户界面的流畅和响应性,iOS App的显示帧率应当保持再60 FPS左右。也就是说主线程有1/60秒的时间来绘制与显示每一帧,AsyncDisplayKit的主要原理就是把图像解码、文本大小计算、绘制、界面布局、对象创建与销毁以及其他耗时的UI操作从主线程中移除,以保持主界面的流畅性。

简单来说,AsyncDisplayKit的工作原理就是使用ASDisplayNode来替代UIView,AsyncDisplayKit 为此创建了 ASDisplayNode 类,包含了UIView的常用属性(比如 frame、bounds、alpha、transform、backgroundColor等)。

为了开发者使用方便, AsyncDisplayKit 把大量常用控件都封装成了ASDisplayNode 的子类,比如 Button、Control、Cell、Image、ImageView、Text 等。利用这些控件,开发者替代原生的UIKit控件。另外,如果ASDisplayNode 无需接受用户事件,可以关闭这个属性(isLayerBacked)。

示例

使用UIKit创建一个UIImageView时

    _imageView = [UIImageView alloc];
    _imageView.image = [UIImage imageNamed:@"img"];
    _imageView.frame = CGRectMake(0.0f, 0.0f, 40.0f, 40.0f);
    [self.view addSubview:_imageView];

使用AsyncDisplayKit来创建UIImageView时

    _imageNode = [ASImageNode new] ;
    _imageNode.image = [UIImage imageNamed:@"img"];//异步解码图片
    _imageNode.frame = CGRectMake(0.0f, 0.0f, 40.0f, 40.0f);
    [self.view addSubview:_imageNode.view];

CPU任务

由前一篇博文可知,
移动设备中显示系统一般是由CPU绘制好显示内容,GPU渲染结束后将渲染结果放入帧缓冲区,随后视频控制器会按照VSync信号(垂直同步)读取帧缓冲区的数据,然后通过数模转换,发送给显示器显示。
如果当一个VSync信号来临的时候,帧缓冲区还没有新的渲染结果,就会使用旧的,而当前帧就会被丢弃。这就是为什么会卡帧的原因,CPU或者GPU绘制渲染跟不上VSync信号频率。

而CPU的主要任务是下面四个,这些任务都发生在主线程,如果比较耗时,就会造成主线程堵塞。

注意:UIView 和 CALayer 不是线程安全的,并且只能在主线程创建、访问和销毁。
一个简单异步绘制的过程大致如下

- (void)display {
    dispatch_async(backgroundQueue, ^{
        CGContextRef ctx = CGBitmapContextCreate(...);
        // draw in context...
        CGImageRef img = CGBitmapContextCreateImage(ctx);
        CFRelease(ctx);
        dispatch_async(mainQueue, ^{
            layer.contents = img;
        });
    });
}

GPU 任务

相对于 CPU 来说,GPU 能干的事情比较单一:接收提交的纹理(Texture)和顶点描述(三角形),应用变换(transform)、混合并渲染,然后输出到屏幕上。通常你所能看到的内容,主要也就是纹理(图片)和形状(三角模拟的矢量图形)两类。

参考文章

https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/

上一篇下一篇

猜你喜欢

热点阅读