Android图形-Vsync机制

目录

引言:

概念:

刷新率:

帧率:

卡顿与丢帧:

Vsync的产生:

Vsync的分发过程:


引言:


显示的原理就是通过不断刷新屏幕缓冲区的数据,显示器就可以显示出来。

概念:

刷新率:

屏幕以一定的频率进行刷新,刷新的过程是先进行逐行扫描,扫描完一帧的数据后就接着扫描下一帧图像的第一行开始重复这样过程就可以形成一个稳定的帧刷新频率。一般情况下是60Hz,即1S中刷新16.6帧图像的速度进行屏幕刷新。用户就可以看到流畅的画面图像,这样的屏幕刷新的速率就叫做帧率

帧率:

是针对图像内存数据而言的。对于Android系统而言,合成和渲染图像数据到内存也是按照一定的速度存放到graphicBuffer的,这个出图的速率就叫做帧率

扫描二维码关注公众号,回复: 16353810 查看本文章

卡顿与丢帧:

图像数据是由应用绘制得到,通过系统服务的合成渲染存放到显存,再有屏幕通过刷新读取到到屏幕进行刷新显示,这是显示的大致过程。
那么如果刷新率>帧率,那么就是说,出图的速度低于屏幕刷新的速度,这是就会造成刷新的时候经常出现读取到的图像数据是同一幅图像的数据,因为你出图速度不够所以只能读取旧的数据,这样就出现卡顿的现象。
当刷新率<帧率的时候,就是说出图了很多帧的图像数据,但是因为你的刷新速度跟不上,就不能把所有由服务端输出的图像数据全部读取到屏幕并且刷新显示出来,所以就出现了丢失了一些图像帧数据的现象。

这个就是卡顿丢帧的现象的根本原因就是刷新率和帧率的同步问题引起的。为了解决这个问题就引入了Vsync的机制。
具体Vsync机制是怎么对帧率和刷新率进行同步的呢?
主要是通过一个固定的Vsync信号,来同步应用,系统服务和屏幕显示这几个部分的工作和数据流转的。对应的是绘制,合成渲染,刷新显示的环节。

Vsync的产生:

可以由硬件产生也可以由软件产生,硬件产生的设备是HWC,软件是通过VsyncThrerad线程模拟来产生。产生了Vsync的事件后会通过一个叫做DispSyncThread的线程来控制分发到另外两个叫做
EventThread-app和EventThread-sf的线程,分别提供给应用端app和服务端(SurfaceFlinger)使用。这几个工作线程都是在SurfaceFlinger服务启动初始化init的时候就创建的。EventThread-app和EventThread-sf的线程需要对同步信号进行一些相位的偏移来满足流水线上的配合。VsyncThread就是在没有HWC硬件产生Vsync信号的时候会被创建。

Vsync的分发过程:

硬件产生的Vsync信号时,就会回调mEventHandler.onVSyncReceived去处理任务
软件时通过线程的循环threadloop,执行sleep的操作,当sleep时间到了就回调mEventHandler.onVSyncReceived去处理任务

当Vsync信号来的时候,就会唤醒EventThread线程,执行所有注册到EventThread的connection的分发出去,就是通过BitTube的mSendFd分发出去,分发出去后mReceivedFd就能接收到数据
SurfaceFlinger和App都在监听这个mReceivedFd事件,当到来的时候就可以响应这个事件进行任务处理了。这就是Vsync事件的基本分发流程了。

猜你喜欢

转载自blog.csdn.net/haigand/article/details/132239549