CADisplayLink

2020-05-28  本文已影响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有什么不同呢?

原理不同
精确不同



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

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

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

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


image.png

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

image.png
上一篇下一篇

猜你喜欢

热点阅读