<h4>一、基本概念</h4>
刷新率
代表屏幕在一秒内刷新屏幕的次数,这个值取决于硬件的固定参数.一般是60Hz,即每16.66ms刷新一次.帧速率
代表了GPU在一秒内绘制操作的帧数,比如30fps/60fps.在这种情况下,高点的帧速率总是好的.
<h4>二、工作原理 </h4>
刷新率和帧速率需要协同工作,才能让你的应用程序的内容显示到屏幕上,GPU会获取图像数据进行绘制,然后负责把内容呈现到屏幕上,这将在你的应用程序的生命周期中周而复始地发生.
<h4>三、协同工作</h4>
不幸的是,刷新率和帧速率并不是总能够保持相同的节奏:
<h6>帧速率比刷新率快的情况</h6>
- 如果帧速率实际上比刷新率快,那么就会出现一些视觉上的问题,比如当帧速率在100fps而刷新率只有75Hz的时候,GPU所渲染的图像并非全都被显示出来.
- 举个例子, 你拍了一张照片,然后旋转90度再拍一张照片,将两种图片的中间剪开并拼接在一起:剪贴在一起这两张图有相似之处,但是上面和下面部分有明显的区别,这就叫Tearing(撕裂),是刷新率和帧速率不一致的结果. 当你的显卡正在使用,一个内存区正在写入帧数据(用来显示一帧的一个Buffer),从顶部开始,新的一帧覆盖前一帧,并立刻输出一行内容.于是,当屏幕开始刷新时,实际上并不知道缓冲区是什么状态(即不知道缓冲区中的一帧是否绘制完毕,即存在只绘制了一半的情况,另一半还是之前的那帧),因此它从GPU中抓住的帧肯可能并不是完全完整的.
- 目前Android的双缓冲(或者三缓冲/四缓冲),这是非常有效的,当GPU将一帧写入一个被称为后缓冲的存储器, 而存储器中的次级区域被称为帧缓冲,当写入下一帧时,它会开始填充后缓冲,而帧缓冲保持不变,现在我们刷新屏幕,它将使用帧缓冲(事先已经绘制好),而不是正在处于绘制状态的后缓冲,这就是VSYNC的作用.如果在屏幕刷新中,VSYNC,即垂直同步,将会在让从后缓冲到帧缓冲的拷贝过程保持同样的复制操作.
- GPU的频率比屏幕刷新率高是正常的,因为你的GPU刷新会比屏幕刷新快,在这种情况下,当屏幕刷新成功,你的GPU将会等待VSYNC信号,直到下一个VSYNC信号到来时(即屏幕刷新时),这时你的帧速率就可以达到设备的刷新率上限. 当然这只是理想情况,当fps达到60的时候,GPU需要在16.66ms内准备好一帧,这对应用程序的要求是非常高的.更不用说100fps了…
<h6>屏幕刷新率比帧速率快的情况 </h6> - 如果屏幕刷新率比帧速率快,屏幕会在两帧中显示同一个画面,当这种断断续续的情况发生时,你就遇到麻烦了.比如你的帧速率比屏幕刷新率高的时候,用户看到的是非常流畅的画面,但是帧速率降下来的时候(GPU绘制太多东西的时候),用户将会很明显地察觉到动画卡住了或者掉帧,然后又恢复了流畅.这通常会被描述为闪屏, 跳帧,延迟.