EventThread线程对VSync的分发
前面提到,EventThread在接收到VSync后再将它们分发给感兴趣的注册者,分发的过程是在其线程循环threadLoop函数中完成的。读者也可以先阅读后面一节内容,先了解感兴趣的注册者如何得到VSync通知以及系统中可能存在哪些感兴趣的注册者后,再回来阅读本小节。
感兴趣的注册者首先需要创建到EventThread的连接,这个到EventThread的连接将保存到EventThread的列表中。创建连接的代码如下(下面的行56,参见文件EventThread.cpp):
由于Connection的父类中有RefBase,所以其重载的onFirstRef函数将被调用,后者又调用registerDisplayEventConnection函数将自己(即“连接”Connection)注册给EventThread(上面的行62);也就是说,每个连接创建时,都要将连接注册到EventThread中,以让EventThread给自己发送VSync事件通知。由于连接可能会失效,所以EventThread中维护的是一个连接的弱指针列表。在有新的连接注册后,需要通知(行63)给threadLoop循环,让其从睡眠中醒来。
EventThread的threadLoop函数的前面的代码如下:
在内嵌的do-while循环(上面的行135~184)中,若注册者指定了需要报告VSync(即行146处的Connection中的count大于0),且VSync时间戳不为0(行153),则跳出该do-while循环,往下执行准备分发VSync事件;若不需要分发,且原来的时间戳不为0,表示VSync还是激活状态,因此去关闭VSync(行157);若时间戳为0,可能VSync原来已经是未激活状态,但若需要分发,则激活VSync(行169);若屏幕关闭(不需刷新输出,VSync关闭)且需分发,那么将睡眠片刻超时后的时间作为VSync时间戳(行178、179),然后在下一个while循环中走到行153和160,跳出while循环,表示是软件模拟的VSync事件;否则,即屏幕打开和屏幕关闭但不需分发的两种情形,这时,将进入睡眠等待状态(行182)。在屏幕打开状态下,VSync很快就会到来(除非主动关闭了VSync),或者有新的感兴趣者进行了注册,或者注册者请求改变了VSync分发频率(见下一小节),这些都将被唤醒行182处的睡眠等待。在屏幕关闭且不需分发VSync的情况下,那么就可以让EventThread线程一直睡眠下去,不需醒来,直到屏幕打开后被唤醒再次开始进行do-while循环的工作。
在跳出第一个内嵌的循环后,表示有VSync需要分发报告,这时将计数器加1(下面的行187),记录下时间戳信息(行188);然后再次在for循环(行192~215)中检查注册者是否已经失效(行196)、报告频率(是否这次该给某个注册者报告,行200、201)等,若需要报告,则将该注册者添加到待报告列表displayEventConnections中(行213)。在行216,若待报告列表为空,则继续while循环,否则就往下执行,准备去分发VSync事件通知。
下面的代码是threadLoop的后面的代码。首先准备好DisplayEvent事件(当前也就只是VSync一种),包括类型和时间戳等信息(行219~221)。再接着,在for循环(行224~246)中,逐个向待处理队列中的连接发送DisplayEvent(VSync)事件(行228)。这就完成了对感兴趣的注册者的分发。
可见,threadLoop首先根据注册者和设备(屏幕是否关闭)等情况判断是否需要分发下一个VSync;在不需要分发(如屏幕关闭并且也没有接收者的情形)或完成任务后等待下一个硬件或软件模拟VSync到来时,则进入睡眠等待状态;当被唤醒(如VSync到来)后,若需要报告分发,则将接收者添加到待处理队列列表中,最后通过连接Connection的postEvent函数分发VSync显示事件给注册的接收者。
本文节选自《深入剖析Android系统》一书
杨长刚著
电子工业出版社出版
相关推荐
`vsync-sf`和`vsync-app`分别代表系统层和应用层的同步,而`VsyncDispatch`、`EventThread`和`TimerFd`等工具则为这种同步提供了底层支持。理解和熟练掌握这些概念对于优化图形应用性能和提升用户体验至关重要。
在IT行业中,尤其是在移动操作系统开发领域,理解和优化Vsync(垂直同步)机制是至关重要的。本主题主要关注的是华为的鸿蒙系统与Vsync波动和丢帧问题的复现示例,这涉及到操作系统如何处理图形渲染和用户体验的关系...
在这个主题中,我们主要探讨的是LibGDX中的全屏模式(FullScreen)和垂直同步(VSync)功能,这两个特性对于游戏性能和用户体验至关重要。 全屏模式(FullScreen)在游戏开发中常常被用到,因为它能提供更好的沉浸...
当GPU完成对后缓冲区的绘制时,可以立即开始在第三个缓冲区上工作,而无需等待Vsync信号。这样,即使在交换缓冲时,GPU也能保持忙碌,从而降低延迟并提高响应速度。当Vsync触发时,显示器会从三个缓冲区中选择最新的...
view.onDraw–>canvas.draw–>rasterizer–> view.onDraw–>canvas.draw- openGL...,候时的制绘们我知通统系,件事收接的知通统系是 大太是不知感 对 。顿卡有会以所,调步个这响影会能可程线主是但,定稳隔间前目台平
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]...
在深入了解`VsyncProvider`之前,我们先理解什么是`vsync`(垂直同步)。 `vsync`是一种视频显示技术,用于确保屏幕刷新与图像数据的更新同步,避免撕裂和闪烁现象。在Flutter中,`vsync`是驱动动画流畅运行的关键...
通过对SurfaceFlinger及其相关技术的深入分析,我们可以了解到其在Android显示系统中的重要地位以及其实现的复杂性。无论是内部机制还是与其他系统的集成,SurfaceFlinger都展现了强大的灵活性和技术深度。希望本文...
谷歌官方发布视频
适用于Cinder的Vsync / FPS测试应用程序 (提交之日为HEAD) 也可以在获得openFrameworks版本
### Display学习笔记 #### 一、显示框架介绍 ##### 1.1 显示屏 显示屏是用户与设备交互的重要组成部分,其质量直接影响用户体验。...通过对Vsync Offset的细致调整,可以进一步提高显示系统的稳定性和性能。
例如,为了提供良好的用户体验,开发者需要确保游戏的帧率稳定,可能需要使用 Choreographer 或 Vsync 信号来同步渲染,避免无谓的CPU和GPU负载。 此外,考虑到"抢滩登陆"可能包含网络功能,如排行榜、成就系统等,...
1. VIC:这是软件中对不同分辨率定义的一个枚举值,便于编程时的直观使用。 2. progressive:分辨率为正极或负极,表示HSYNC和VSYNC的极性,用一个字节来表示。 3. Htotal:HSYNC的总周期,表示HSYNC波形完整周期的...
在 Choreographer 的源码中,构造函数 private Choreographer(Looper looper) 中,做了几个初始化操作,根据 Looper 对象生成,Looper 和线程是一对一的关系,对应上面说明里的每个线程对应一个 Choreographer。...
这可能包括使用硬件加速解码、合理分配内存、避免不必要的数据拷贝以及利用Vsync信号进行同步等。 7. **用户界面设计**:虽然描述中没有明确提及,但一个完整的播放器应该具备播放、暂停、快进、快退、全屏切换等...
在IT行业中,尤其是在图形处理和显示系统领域,`Vsync(垂直同步)` 是一个非常重要的概念。`Vsync` 的作用是确保显示器与图形处理器之间的帧率同步,防止画面撕裂现象。`Single and Single` 模式通常指的是在硬件层面...
Project Butter 对 Android Display 系统进行了重构,引入了三个核心元素,即 VSYNC、Triple Buffer 和 Choreographer。其中,VSYNC 是理解 Project Buffer 的核心。VSYNC 是 Vertical Synchronization(垂直同步)...
其中,`[全局选项]` 是对整个命令的影响,`-i 输入文件` 指定输入源,`[输入选项]` 用于处理输入,`[输出文件]` 是转换后的目标文件,`[输出选项]` 控制输出设置。 2. **输入选项** - `-i 文件名`:指定输入文件。...
理解这段代码需要对Verilog语法和数字逻辑有基础了解。 在实际应用中,设计者需要根据VGA分辨率(如640x480、800x600等)和刷新率(如60Hz、75Hz等)来设定这些时序参数。通过适当的参数配置,可以确保在显示器上...
它决定了引脚 5 上 VSync 信号的频率,并相应地切换引脚 6 的输出电平(50Hz = 0V;60Hz = 5V)。 该程序已发布到公共领域; 作者希望上述原始归属保持不变。 引脚配置: ,---_---. +5V |1 8| GND nc |2 7| nc nc |...