`

EventThread线程对VSync的接收

阅读更多

  EventThread线程对VSync的接收

EventThread被设计用来接收VSync事件通知,并分发VSync通知给系统中的每一个感兴趣的注册者。VSync来源自底层硬件驱动程序的上报,对于Android能看到的接口来说,它是来自HAL层的hwc_composer_device的抽象硬件设备。若硬件不支持,则HWComposer会创建一个线程去模拟产生VSync事件通知。一旦工作起来,VSync将像一个脉搏一样,不断通知到Surfaceflinger中的EventThread线程,由后者再分发给感兴趣的注册者。

先来看一下EventThread何时被创建并开始运行的。

SurfaceFlinger类被创建时,它的onFirstRef函数将被调用(因为最终继承自RefBase),代码如下:

 

因为SurfaceFlinger继承自线程类Thread(上面的行130)调用了run函数,意味着创建一个新线程的执行。它的过程是:Thread::run将创建一个新线程,名称为SurfaceFlinger(后面我们将称之为SurfaceFlinger线程),线程的入口函数Thread::_threadLoop又将调用子类重载的threadLoop函数,不过在调用重载的threadLoop之前,先调用子类重载的readyToRun(只是初次时)。也就是说,此处的run函数调用将启动一个新线程SurfaceFlinger,然后SurfaceFlingerreadyToRun函数在其里面被调用,从而做一些初始化工作,如前面提到的从ashm分配一块共享控制块surface_flinger_cblk_t,见前面的11.5.2小节。

SurfaceFlingerreadyToRun函数的后面,将会创建EventThread线程(下面的行300):


 在其EventThreadonFirstRef中被要求开始执行,见行52(参见文件EventThread.cpp):


 这样,EventThead在创建后,马上开始了它的线程循环。

再来看一下HAL层是如何向EventThread发送VSync通知的。

HAL层的文件hardware/libhardware/include/hwcomposer.h中定义了一个供底层向上调用的回调例程hwc_procs结构体,它包含两个例程函数:invalidatevsync。代码如下(见文件hwcomposer.h):

AndroidHWComposer.h中定义了两个结构体:回调callbacks和回调上下文cb_context。其中callbacks继承自上面的hwc_procs,代码如下:


 HWComposer的构造函数中,先从库中解析符号,然后打开HWComposer硬件模块(下面的行00063),再根据其open函数打开HAL抽象硬件设备mHwc(下面的行00066),然后再判断硬件设备mHwc是否支持registerProcs函数(下面的行00070)。若硬件平台厂商实现了该函数,并在open函数中将其赋值给了HAL抽象硬件设备hwc_composer_deviceregisterProcs成员,则该成员不为空,表示支持上述的回调例程hwc_procsHWComposer的构造函数将依据此来判断是否支持VSync,代码如下(参见文件HWComposer.cpp):


 在硬件平台支持VSync的情况下,通过上面的行0007200073的赋值和行00074的注册回调例程,来自底层HAL的调用,将转到调用钩子函数hook_xxx。其中回调例程hwc_procs中的VSync将指向hook_vsync钩子函数,后者代码如下(参见文件HWComposer.cpp):


 它又调用到下面的VSync成员函数(参见文件HWComposer.cpp):


 上面行00125mEventHandler实际为DisplayHardware对象。在HWComposer中,定义了一个抽象接口EventHandler,并维护了一个EventHandler类型的对象引用;而DisplayHardware实现了该接口,并在DisplayHardwareinit函数初始化时,创建了HWComposer对象,将其指定给了HWComposer维护的EventHandler对象引用(即mEventHandler,见上面HWComposer构造函数的行00048)。因此,对VSync的调用将调用到DisplayHardwareonVSyncReceived函数,后者的代码如下(参见文件DisplayHardware.cpp):


 这将继续调用到DisplayHardware中维护的一个handler,而这个handler实际是EventThread的对象(见EventThread::onFirstRef函数,在该函数中指定)。因此,对VSync的调用实际调用到下面的EventThreadonVSyncReceived成员函数(见EventThread.cpp:


 这将唤醒EventThread线程的循环函数threadLoopCondition上的睡眠等待。

EventThread的线程循环函数threadLoop主要用于向系统中对VSync感兴趣的注册者分发VSync事件通知,下节将对其做详细介绍。

对于不支持VSync上报通知的硬件平台来说,则HWComposer会创建一个VSyncThread线程,用于模拟VSync的发送。在HWComposer构造函数的后面,判断出需要模拟一个VSync线程后即创建该线程(下面的行92),代码如下:


 VSyncThread的线程循环函数threadLoop后面的部分代码如下(参见文件HWComposer.cpp):


 上面的行318睡眠片刻,醒来后即模拟发送VSync事件通知(行322)。睡眠的时间最终由HWComposer中的刷新率变量mRefreshPeriod确定,该值来自framebuffer device或系统设置信息,mRefreshPeriodHWComposer的构造函数中被赋值,见前面其构造函数的代码行55中。如图11-21所示,VSync起源于①,经过一步步调用,执行到②,唤醒可能正在睡眠的线程,然后由线程循环函数去分发它。图中①到②是本小节讲述的,②后面的将在下一小节讲述。


 图11‑21 EventThread接收和分发VSync示意图

 

 


 本文节选自《深入剖析Android系统》一书

杨长刚著

电子工业出版社出版

 

  • 大小: 9.7 KB
  • 大小: 3.1 KB
  • 大小: 4 KB
  • 大小: 6.1 KB
  • 大小: 24.5 KB
  • 大小: 29.5 KB
  • 大小: 3.4 KB
  • 大小: 5.6 KB
  • 大小: 15.6 KB
  • 大小: 5.2 KB
  • 大小: 6 KB
  • 大小: 6.7 KB
  • 大小: 44.7 KB
  • 大小: 18.5 KB
0
0
分享到:
评论

相关推荐

    vsync 生产、vsync-app 和 vsync-sf 请求、响应

    `vsync-sf`和`vsync-app`分别代表系统层和应用层的同步,而`VsyncDispatch`、`EventThread`和`TimerFd`等工具则为这种同步提供了底层支持。理解和熟练掌握这些概念对于优化图形应用性能和提升用户体验至关重要。

    鸿蒙系统vsync波动丢帧复现demo.zip

    在IT行业中,尤其是在移动操作系统开发领域,理解和优化Vsync(垂直同步)机制是至关重要的。本主题主要关注的是华为的鸿蒙系统与Vsync波动和丢帧问题的复现示例,这涉及到操作系统如何处理图形渲染和用户体验的关系...

    libgdx FullScreen&vsync

    在这个主题中,我们主要探讨的是LibGDX中的全屏模式(FullScreen)和垂直同步(VSync)功能,这两个特性对于游戏性能和用户体验至关重要。 全屏模式(FullScreen)在游戏开发中常常被用到,因为它能提供更好的沉浸...

    What are Double Buffering, vsync and Triple Buffering

    当GPU完成对后缓冲区的绘制时,可以立即开始在第三个缓冲区上工作,而无需等待Vsync信号。这样,即使在交换缓冲时,GPU也能保持忙碌,从而降低延迟并提高响应速度。当Vsync触发时,显示器会从三个缓冲区中选择最新的...

    android 渲染架构演进

    view.onDraw–>canvas.draw–>rasterizer–> view.onDraw–>canvas.draw- openGL...,候时的制绘们我知通统系,件事收接的知通统系是 大太是不知感 对 。顿卡有会以所,调步个这响影会能可程线主是但,定稳隔间前目台平

    VGA.rar_ vsync_Act 1_wire hcount_ov

    vsync ) input clock //系统输入时钟 50MHz input [1:0]switch output [2:0]disp_RGB //VGA数据输出 output hsync //VGA行同步信号 output vsync //VGA场同步信号 reg [9:0] hcount //VGA行扫描计数器 reg [9:0]...

    vsync_provider:VsyncProvider为AnimationController提供vsync。 这适用于提供程序包

    在深入了解`VsyncProvider`之前,我们先理解什么是`vsync`(垂直同步)。 `vsync`是一种视频显示技术,用于确保屏幕刷新与图像数据的更新同步,避免撕裂和闪烁现象。在Flutter中,`vsync`是驱动动画流畅运行的关键...

    SurfaceFlinger 视频教程 显示系统,内部机制,Vsync机制,HDMI系统

    简单来说,SurfaceFlinger就像一个“窗口服务器”,它接收来自不同应用程序的图像数据,进行必要的处理后,将其正确地显示在屏幕上。 #### 显示系统的架构与组成 在深入探讨SurfaceFlinger之前,我们先来了解一下...

    Android 性能优化一: 17.Android Performance Patterns- Understanding VSYNC.mp4

    谷歌官方发布视频

    ciVSyncTestApp:用于Cinder的Vsync FPS测试应用程序

    适用于Cinder的Vsync / FPS测试应用程序 (提交之日为HEAD) 也可以在获得openFrameworks版本

    STM32F4系列中文手册0002.pdf

    * 位 3 VSYNC_MIS:VSYNC 屏蔽中断状态 (VSYNC masked interrupt status):0:VSYNC 电平跳变时不生成中断,1:VSYNC 每次从无效电平变为有效电平且 DCMI_IER 中的 VSYNC_IE 位置 1 时都生成一个中断。 * 位 2 ERR_...

    Android基于Choreographer的渲染机制详解.docx

    在 Choreographer 的源码中,构造函数 private Choreographer(Looper looper) 中,做了几个初始化操作,根据 Looper 对象生成,Looper 和线程是一对一的关系,对应上面说明里的每个线程对应一个 Choreographer。...

    display学习笔记

    ### Display学习笔记 #### 一、显示框架介绍 ##### 1.1 显示屏 显示屏是用户与设备交互的重要组成部分,其质量直接影响用户体验。...通过对Vsync Offset的细致调整,可以进一步提高显示系统的稳定性和性能。

    电子功用-数字电视垂直同步脉冲检测器

    - **帧同步**:检测器用于识别VSYNC信号,确保接收的视频数据能够准确地与显示器的刷新周期同步,避免图像错位。 - **时钟恢复**:通过分析VSYNC,可以恢复出视频数据的时钟信号,用于解码过程。 - **错误检测与...

    TI-DS90CF384A.pdf

    它能将四路LVDS(低压差分信号)数据流转换回并行的28位CMOS/TTL数据,其中包含24位RGB颜色信息和4位同步控制信号(Hsync, Vsync, DE和CNTL)。而DS90CF364A则是18位的接收器,处理速度稍慢,为1.3 Gbps,带宽为170 ...

    esp32 通过WiFi联网控制摄像头采集图像并通过oled屏幕显示

    连接时,确保摄像头的电源、时钟(CLK)、数据输入/输出(DIN/DOUT)、帧同步(HSYNC/VSYNC)和像素时钟(PCLK)引脚正确连接到ESP32相应的GPIO口。 其次,ESP32的Wi-Fi功能用于建立网络连接。你需要使用ESP-IDF...

    对TFT屏时序分析来确定VBPD等值

    在设计和驱动TFT屏时,理解其时序至关重要,因为它决定了屏幕如何正确接收并显示数据。时序分析是确保TFT屏正常工作的重要环节,特别是涉及到VBPD(Vertical Back Porch)等关键参数的确定。 TFT屏的时序通常由以下...

    vga_time.rar_VGA时序_时序

    这些区域提供了一定的延迟,确保显示器有足够的时间准备接收新的数据。 5. **同步脉冲宽度(Sync Pulse Width)**:HSync和VSync脉冲的持续时间,决定了扫描线的精确位置。 6. **行周期(Line Time)和帧周期...

    HDMI的基本传输原理

    - **控制数据传输期**:在此期间,每个TMDS通道包含2位的控制数据,一共6位的控制数据包括HSYNC(行同步)、VSYNC(场同步)、CTL0、CTL1、CTL2和CTL3。在每个控制周期的最后阶段,由CTL0、CTL1、CTL2和CTL3组成的...

Global site tag (gtag.js) - Google Analytics