资讯详情

Android画面显示流程分析(1)

目录截图:

企业微信截图_16324493913554.png

1. 前言

本文尝试从硬件认识开始介绍Android如何更新显示系统的图片,希望能android系统如何更新图片,给读者带来感性认知。试着在文章中解释一下App画一帧图片到这帧图片是如何到达屏幕并最终被人眼看到的整个过程,这将涉及一些硬件的基本知识和Android一些重要的软件基软件基本组件。本文将首先介绍图片显示过程中涉及的重要组成部分及其工作原理,然后从Android app渲染第一帧的图片开始逐渐连接到每个组件,期待着最终Android如何在系统下显示图片,给读者一个宏观的理解。本文适合对Android对显示系统有一定了解的学生阅读。由于文章较长,这里将分为10章,共5篇博文介绍。

因为这篇文章是通过阅读各种文章和代码来总结的,有些地方不可避免地理解错误,欢迎批评和纠正。

2. 显示硬件基础

无论软件的架构设计有多高端、多高档,最终都离不开硬件的支持。软件架构是基于硬件的运行原理。因此,在讨论软件设计之前,有必要对显示硬件的原理有一个初步的了解。

2.1. 常见的显示设备

(Liquid Crystal Display)俗称液晶。

液晶是一种材料,液晶有一个特点:液晶分子可以在电信号的驱动下旋转,会影响透光性。

因此,我们可以在整个液晶面板后面使用白光(称为背光),液晶分子可以通过不同的电信号进行选择性透光。此时,我们在液晶面板前看到各种不同的颜色,这就是LCD显示图片的原理。

有些显示器(例如LED显示器、CRT显示器本身就会发光,称为主动发光,有的(LCD)它本身不会发光,只会发光,需要背光的帮助才能看起来发光,称为被动发光。

其他主流显示设备:

:阴极摄像头显示器。 以前的大屁股电视机是CRT它曾经是应用最广泛的显示器之一,但现在基本上没有使用这种技术。

:有机发光二极管又称有机电激光显示(Organic Light-Emitting Diode,OLED),OLED显示技术具有自发光的特点,采用非常薄的有机材料涂层

玻璃基板可以更轻更薄,视角更大,可以显著节约电能。目前还没有成为主流,但市场潜力很大,未来很可能会被取代LCD。

:主要用于户外大屏幕

2.2. LCD的接口技术

(Video Graphics Array)即视频图形阵列,具有分辨率高、显示速度快、色彩丰富等优点。VGA接口不但是CRT显示设备的标准接口也是LcD液晶显示设备的标准接口,具有广泛的应用范围。相信很多朋友都很熟悉,因为这个接口是电脑显示器上最重要的接口,从巨大的大块头开始CRT从显示时代开始,VGA界面已经使用,并且一直沿用到今天。

(High Definition Multimedia Interface) 高清多媒体接口是一种可以发送未压缩音频和视频信号的全数字视频和声音发送接口。HDMI可用于机顶盒,DVD播放机、个人电脑、电视、游戏主机、综合扩展机、数字音响、电视等设备。HDMI音频和视频信号可以同时发送,因为音频和视频信号使用相同的线,大大简化了系统线路的安装难度。

(Digital Visual Interface),即数字视频接口。它是1998年9月,在Intel开发者论坛成立,由Silicon Image、Intel(英特尔),Compaq(康柏)、IBM(国际商业机械公司)HP(惠普)、NEC(日本电气有限公司)Fujitsu(富士通)等公司共同组成DDWG(Digital Display Working Group,数字显示工作组)推出的接口标准

(Low Voltage Differential Signaling,即低压差信号,也称为接口RS-644总线接口是20世纪90年代提出的一种数据传输和接口技术。LVDS接口是美国NS美国国家半导体公司克服了它TTL开发了一种数字视频信号传输方式,用于传输宽带高码率数据时功耗大、电磁干扰大等缺点。由于采用低压、低电流驱动,实现了低噪声、低功耗。LVDS技术具有低功耗、低误码率、低串扰和低辐射等特点,其传输介质可以是铜质的PCB连接,也可以是平衡电缆。LVDS在液晶电视中越来越广泛地应用于信号完整性、低抖动和高共模特性的系统中。

(Mobile Industry Processor Interface)是2003年由ARM, Nokia, ST ,TI公司成立的联盟旨在规范相机、显示接口、射频/基带接口等手机内部接口,从而降低手机设计的复杂性,提高设计的灵活性。MIPI下面有不同的联盟WorkGroup,手机内部接口标准分别定义,如摄像头接口、显示接口、射频接口DigRF、麦克风/喇叭接口SLIMbus等等。统一接口标准的优点是,手机制造商可以根据需要灵活地从市场上选择不同的芯片和模块,在更改设计和功能时更方便。

目前手机屏幕和SOC间多使用MIPI接口传输屏幕数据,如下图所示,图中的条状芯片是负责更新显示屏显示内容的芯片DDIC, 它一边通过mipi协议和SOC通信时,将获得的显示数据写入显示存储器GRAM内, 屏幕(Panel)不断扫描GRAM不断更新液晶显示点的颜色,更新图片。

屏幕坐标系

显示屏采用以屏幕左上角为原点的二维坐标系,X方向向右,Y轴向方向下,屏幕上的显示单元(像素)排列整齐,如下图所示,如下图所示,六边形块代表像素点。例如,本文中的所有图表都将代表屏幕上的像素点。

典型的Android一般包括显示系统SOC、DDIC、Panel三个部分, SOC负责绘画与多层的合成,通过硬件接口将合成数据传输给某种协议DDIC,然后DDIC负责把buffer内部数据呈现Panel上。如下图所示,高通平台上的图片更新简单示意图。CPU或GPU负责绘画,绘画多个layer交由MDP合成,合成数据通过mipi协议和DSI总线传输给DDIC, DDIC将数据存到GRAM内(非video屏), Panel不断scanGRAM显示内容。

那么对于DDIC它的职责就是按mipi协议和SOC互动,获得从SOC合成一帧数据,然后将数据写入GRAM,对GRAM写入应符合一定的顺序。

2.3. LCD时序

这个写入时序应该首先从过去开始 CRT 从显示原理开始。CRT 电子枪从上到下扫描。扫描完成后,显示器显示一帧图片,然后电子枪返回初始位置继续下一次扫描。显示器显示器的显示过程与系统的视频控制器同步,显示器(或其他硬件)将使用硬件时钟产生一系列定时信号。当电子枪换成新行并准备扫描时,显示器会发出水平同步信号(horizonal synchronization),简称 HSync;画完一帧后,电子枪回到原位,准备画下一帧,显示器会发出垂直同步信号(vertical synchronization),简称 VSync。显示器通常以固定频率刷新,即 VSync 产生信号的频率。虽然目前的设备大多是液晶显示屏,但原理没有改变。

:只有在时钟上升或下降时,像素数据才能有效 :当数据使能信号高时,CLK当信号到达时,输出有效数据。 :行同步信号的前肩沿水平同步信号上升ENABLE上升沿的间隔。 :低电平(非有效电平)的水平同步信号持续时间 :行同步信号的后肩,ENABLE的下降沿到水平同步信号的下升沿的间隔 如下图所示

图中从HSYNC从下降边开始,等待两个CLK产生上升沿,等待HBP随着时间的推移,一行像素数据开始传输,像素数据只写在像素时钟和上升或下降(这里我们只讨论原理,而不是特定平台的具体实现,所以HSW对应的时钟数字不以图中所示为准,具体产品会有调整和变化),N像素时钟后,一行像素数据成功写入D1-Dn

类似地,两帧画面之间也有一些间隔:

: VSYNC信号下降时间沿着上升边缘下降 : 帧同步信号的前肩 :帧同步信号的后肩 : 它被称为消隐区,指 VSW VBP VFP , 这段时间Panel不要更新像素点的颜色

在一个Vsync周期内是由多个Hsync由周期组成的个数是Y方向屏幕上的像素点数,即屏幕上有多少行像素点, 每个Hsync传输一行中所有像素点的数据。通常屏幕给的spec文档还会给出类似下面这样的图,但都是表达一个意思,数据是以行为单位写入的,Hsync是协调行和行之间的同步信号,多个行依次写入构成一帧数据,帧和帧数据之间由Vsync信号来同步协调。

当多帧画面依次输出到屏幕的时候我们就可以看到运动的画面了,通常这个速度到达每秒60帧时人眼就已经感觉画面很流畅了。下图演示了在vsync和hsync同步下两帧画面间的切换时序,以及消隐区(VPorch)在其中的位置关系。在消隐区结束(或开始)时DDIC会向SOC发出一个中断信号,这个信号称为TE信号, SOC这边就是通过该中断信号来判断上一帧数据是否已被DDIC读走,进而决定是否可以将buffer写入下一帧数据。

2.4. LCD上的画面更新流程

让我们以下面这张图来说明从SOC到到DDIC再到Panel的画面更新过程,首先SOC准备画面A, DDIC上一帧画面更新完毕进入消隐区,同时向SOC侧发送TE信号,SOC收到TE信号后,A画面的数据开始通过DSI总线向DDIC传输(DSI Write),当消隐区时间结束时开始这一帧数据从数据变为像素点颜色的过程(Disp Scan), Disp Scan是以行为单位将GRAM内一行的数据内容通过改变电流电压等方式改变Panel上像素点的颜色。进而实现一行画面的更新,按下来Disp Scan将以一定速度逐行读取GRAM的内容,而于此同时DSI Write也还在进行中,由于DSI Write较Disp Scan早了一个Vporch的时间,所以Disp Scan扫描到的数据都是A画面的数据。那么人眼会看到画面“逐渐”出现到显示屏上,当A画面的所有行都经Disp Scan到达屏幕后,下一个Vporch开始,DDIC再次向SOC发出TE信号, 下帧B画面的数据开始经过DSI总线传输到DDIC, 如此循环往复可以将连续的A, B, C画面更新到屏幕上。

这里我们思考一个问题: 就像上图中所绘一样总会存在一段时间GRAM内的数据会出现一部分是新画面的数据,一部分是旧画面的数据,那么从上帝视角看GRAM里的画面是“撕裂”的,那Disp Scan会不会把这个“撕裂”的画面显示到Panel上呢? 用户有没有可能看到一个“撕裂”的画面呢?

答案是有可能会。

为讨论方便我们这里先把DSI write记作写, 把Disp Scan记作读, 正常情况下,我们会将读速度调到和写速度差不多,由于写是在进入vporch时就开始了,而读的动作是离开vproch时,所以在读和写的这场“百米跑”竞赛中总是写跑在前面,这样保证读始终读到的是同一帧画面的数据,这个过程如下面图1所示。

由于读和写的速度受到环境或各种电气因素影响并不是一成不变的,在实际运行过程中会有波动,当读和写两条线离的较近时由于速度波动的存在会出现两条线交叉的情况,如图2所示,那么这时读会先后读到前后两帧的数据,出现花屏现象。

有时我们为了避免由于速率波动引起花屏问题,会放大vporch的时间让读和写尽量拉开距离,这样可以减少花屏现象出现的概率,这里的原理如图3所示

继续思考下一问题: 从上面的分析可以看出Panel上的像素数据是一行行更新下来的,那人眼为什么没有看到更新了一半的画面呢?

这个问题我并不知道答案,这可能涉及到人眼的生物学构造,人眼对事物的成像原理等复杂的原理,总之是在这个时间尺度内人眼看不到。

接下来我们从另一角度来研究一下这个问题,我们把视角切换到上帝视角,假如存在上帝之眼的话,他应该能看到这个更新了一半的画面,我们尝试用高速摄影机来模拟“上帝之眼”。

首先我们先准备一些测试代码, 我们写一个测试用apk, 下面这段代码是向Android框架注册一个Choreographer的监听,Choreographer是Android提供的一个获取vsync信号的通道。当下图中doFrame被调用到时我们这里可以暂时粗略理解为是上面所讨论的TE信号, 这里收到Vsync信号后通过Pthread的Condition通知到另一线程。这用于模拟一个vsync的消息泵。

Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() {
    @Override
    public void doFrame(long frameTimeNanos) {//当vsync信号来时会调用到这里
            Global.lock.lock();
            try {
                Global.syncCondition.signal();//通知另一条线程更新画面
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Global.lock.unlock();
            }
            Choreographer.getInstance().removeFrameCallback(this);
            Choreographer.getInstance().postFrameCallback(this);
    }
});

下面代码中每收到一个vsync信号都会去画一帧画面,同时给帧编号编号加1(相当于给每一帧一个编号),如果当前的编号为奇数则画绿色,如果为偶数则画蓝色,那么画面应该是蓝绿交替出现:

public class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
    .......

    @Override
    public void run() {
        while(true) {
            Global.lock.lock();
            try {
                Global.syncCondition.await();//在这里等待vsync到来的通知消息
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                Global.lock.unlock();
            }
            draw();//画蓝色或绿色
        }
    }
    ........
    private void draw() {

        Canvas mCanvas = null;
        try {
            mCanvas = mSurfaceHolder.lockCanvas();
            if(autoNum %2 == 0) {
                mPaint.setColor(Color.BLUE);//如果为双数则画面画成蓝色
            } else {
                mPaint.setColor(Color.GREEN);//如果为单数则画面画成绿色
            }
            mCanvas.drawRect(0, 0, getRight(), getBottom(), mPaint);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (mCanvas != null) {
                mSurfaceHolder.unlockCanvasAndPost(mCanvas);
            }
        }
        autoNum++;//数字加1
    }

}

下面是高速摄影机看到的画面变化情况,从下图中可以看出来,画面从绿变蓝的过程中总是能看到先是上面部分变蓝色,接下来才会看到全部变蓝,由蓝变绿也是同样的现象,先是图像上面变成绿色接下来全部变绿色,在“上帝之眼”看来画面的变化是有前后两个画面各占一部分的情况的,这情况是上面是新画面下面是旧画面,但人眼是看不出来这种画面。

下面的图中发现画面是颜色渐变的,这是因为通过高速摄影机是画面再次感光形成的影像,由于物理世界中光线是有衍射及曝光时长因素的,所以最终在高速摄影机留下的图中是颜色渐变的。

2.5. 本章小结

在本章节中,我们了解到了一些显示硬件的一些组成要件,以及屏幕是如何按时序更新画面的,以及在画面更新过程中屏和SOC间的一些互动是如何完成的。那么接下来我们再来了解下SOC内部是如何把画面送过来的。

本文转自 https://www.jianshu.com/p/df46e4b39428,如有侵权,请联系删除。

标签: 二极管31df4直接绿色激光二极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台