美文网首页
iOS图片渲染过程

iOS图片渲染过程

作者: 繁星mind | 来源:发表于2019-05-27 23:52 被阅读0次

iOS渲染过程:
1.在 VSync 信号到来后,主线程开始在cpu上做计算。
2.CPU计算显示内容:视图创建、布局计算、图片解码、文本绘制等。
3.GPU进行渲染:CPU将计算好的内容提交给GPU,GPU 进行变换、合成、渲染。
4.GPU 会把渲染结果提交到帧缓冲区去,等待下一次 VSync 信号到来时显示到屏幕上。

渲染时机
1.Core Animation 在 RunLoop 中注册了一个 Observer 监听 BeforeWaiting(即将进入休眠) 和 Exit (即将退出Loop) 事件 。

  1. 在操作 UI 时,比如改变了 Frame、更新了 UIView/CALayer 的层次时,或者手动调用了 UIView/CALayer 的 setNeedsLayout/setNeedsDisplay方法后,这个 UIView/CALayer 就被标记为待处理,并通过 CATransaction 提交到一个全局的容器。
    3.当Oberver监听的事件到来时,把所有的中间状态合并提交到 GPU 去显示。
    4.如果此处有动画,通过 DisplayLink 稳定的刷新机制会不断的唤醒runloop,使得不断的有机会触发observer回调,从而根据时间来不断更新这个动画的属性值并绘制出来。

Core Animation作用
1.通过监听RunLoop,在空闲时进行UI绘制和渲染。
2.控制动画的显示。

CALayer和UIView的关系
1.UIView是CALayer的代理,主要做视图管理,CALayer用来视图显示。
2.UIView可以响应事件,而CALayer没有这个功能。
3.UIView 的 Layer 在系统内部,被维护着三份同样的树形数据结构,分别是:

  • 模型树(这里是代码可以操纵的,设置属性的最终值会立刻在这里更新);
  • 呈现树(是一个中间层,系统就在这一层上更改属性,进行各种渲染操作。比如一个动画是更改alpha值从0到1,那么在逻辑树上此属性会被立刻更新为最终属性1,而在动画树上会根据设置的动画时间从0逐步变化到1);
  • 渲染树(其属性值就是当前正被显示在屏幕上的属性值);
    image.png

layoutSubviews在以下情况下会被调用:
1.initWithFrame:
2.addSubview会触发layoutSubviews
3.修改view的Frame
4.scrollview滚动的时候。
5.旋转Screen会触发父UIView上的layoutSubviews事件
6.改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

drawRect在以下情况下会被调用:
1.该方法在调用sizeToFit后被调用,所以可以先调用sizeToFit计算出size。然后系统自动调用drawRect:方法。
2.设置contentMode属性值为UIViewContentModeRedraw。那么将在每次设置或更改frame的时候自动调用drawRect:。
3.直接调用setNeedsDisplay,或者setNeedsDisplayInRect:触发drawRect:,但是有个前提条件是rect不能为0。
4.UIView初始化,并设置frame以后,会被调用。

注意点:
1.只能在drawRect方法中获得contextRef,并且drawRect不能被直接调用。
2.在实时绘图中,不能使用gestureRecognizer,只能使用touchbegan等方法来掉用setNeedsDisplay实时刷新屏幕。

-drawRect:(CGRect)rect方法:重写此方法,执行重绘任务
-setNeedsDisplay方法:标记为需要重绘,异步掉用drawRect
-setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

参考:
iOS 事件处理机制与图像渲染过程
iOS中图片的解压缩到渲染过程详解
详解CALayer 和 UIView的区别和联系
iOS - layoutSubviews总结(作用及调用机制)

相关文章

网友评论

      本文标题:iOS图片渲染过程

      本文链接:https://www.haomeiwen.com/subject/botmzqtx.html