美文网首页
CADisplayLink

CADisplayLink

作者: 我的发 | 来源:发表于2020-05-28 18:41 被阅读0次

    先看一下这个类的官方注释

    /** Class representing a timer bound to the display vsync. **/
    
    API_AVAILABLE(ios(3.1), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos)
    @interface CADisplayLink : NSObject
    {
    @private
      void *_impl;
    }
    

    Class representing a timer bound to the display vsync

    通过注释可以知道它就是一个和display vsync绑定在一起的对象。那么display vsync是什么意思呢?其实它就是屏幕刷新频率。

    VSync信号

    屏幕刷新频率。手机屏幕界面是由 VSync 信号驱动的,VSync 由硬件时钟生成,每秒发出60次(这个值取决于设备,iPhone 上通常是 59.97 次)。在 VSync 信号到来后,系统图形服务会通过 CADisplayLink机制通知 App。所以可以认为CADisplayLink是和屏幕刷新同一频率的定时器

    大家都是定时器,CADisplayLink 和NSTimer有什么不同呢?

    原理不同
    • CADisplayLink属于QuartzCore框架,是和VSync 信号绑定在一起的,由硬件时钟驱动。
    • NSTimer属于Fundation框架,由Runloop驱动。
    精确不同
    • CADisplayLink和屏幕刷新率同步的频率执行方法,因此精准比较高。几乎是每秒60次。
    • NSTimer触发时间到的时候,runloop如果在忙于别的调用,触发时间就会推迟到下一个runloop周期。



    额外补充:Vertical Sync信号垂直同步的概念

    CPU 计算好显示内容提交到 GPU,GPU 渲染完成后将渲染结果放入帧缓冲区,随后视频控制器会按照 VSync 信号逐行读取帧缓冲区的数据,传递给显示器显示。

    在最简单的情况下,帧缓冲区只有一个,这时帧缓冲区的读取和刷新都都会有比较大的效率问题。为了解决效率问题,显示系统通常会引入两个缓冲区,即双缓冲机制。在这种情况下,GPU 会预先渲染好一帧放入一个缓冲区内,让视频控制器读取,当下一帧渲染好后,GPU 会直接把视频控制器的指针指向第二个缓冲器。如此一来效率会有很大的提升。

    双缓冲虽然能解决效率问题,但会引入一个新的问题。当视频控制器还未读取完成时,即屏幕内容刚显示一半时,GPU 将新的一帧内容提交到帧缓冲区并把两个缓冲区进行交换后,视频控制器就会把新的一帧数据的下半段显示到屏幕上,造成画面撕裂现象,
    因为iOS系统的图形渲染是双缓冲机制,所以有可能会引发画面不同步的撕裂现象。
    这下这张是在YY大神博客看到的经典图片,这就是没有开启垂直同步的情况:


    image.png

    我简单概括一下,它是GPU为了解决双缓冲机制引发的画面不同步问题的一种解决办法
    当开启垂直同步后,GPU会等待显示器的VSync信号发出后才进行新的一帧渲染和换缓冲区的刷新,就不会出现画面撕裂的情况。

    image.png

    相关文章

      网友评论

          本文标题:CADisplayLink

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