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 生产、vsync-app 和 vsync-sf 请求、响应; 核心代码、类图、pefetto 图
libgdx FullScreen&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]...
vsync_provider VsyncProvider为AnimationController提供vsync。 这适用于。 例子
图文并茂地讲述了图形显示double buffering、vsync信号和triple buffering的机理。
谷歌官方发布视频
SurfaceFlinger 视频教程 显示系统,内部机制,Vsync机制,HDMI系统
适用于Cinder的Vsync / FPS测试应用程序 (提交之日为HEAD) 也可以在获得openFrameworks版本
FPGA控制VGA接口显示屏8种色彩的循环变化实验Verilog逻辑源码Quartus11.0工程文件, FPGA型号为CYCLONE4E系列中的...//分别对RGB的3位数据进行判断 //R,G,B控制液晶屏颜色显示 //最终显示屏显示的颜色是RGB3种颜色的叠加
华为 鸿蒙系统 开发
ffmpeg作为音视频开发和解码的主要工具,其命令格式为应用提供了很大的方便,该工具主要是介绍了ffmpeg的命令参数,非常全面,希望能帮到您。最全的ffmpeg命令参数
它决定了引脚 5 上 VSync 信号的频率,并相应地切换引脚 6 的输出电平(50Hz = 0V;60Hz = 5V)。 该程序已发布到公共领域; 作者希望上述原始归属保持不变。 引脚配置: ,---_---. +5V |1 8| GND nc |2 7| nc nc |...
垂直同步 用于FiveM服务器的简单天气和时间同步脚本。 当前版本: 1.3.0作者: Vespura最近更新: 2018年1月13日 特征 每隔10分钟(可以(暂时或永久)禁用)动态变化的天气。天气将仅根据实际情况而变化。...
授予它对整个 Dropbox 的完全访问权限。 您可以随意命名; 它只会被你使用。 在您的应用设置页面上,为您的帐户获取“生成的访问令牌”。 在~/.shadowbox创建一个文件,其中包含: { "token": "YOUR_G
XILINX SPARTAN6 FPGA OV75640摄像头GVA显示实验 VERILOG逻辑例程源码 ISE14.7工程文件 module ov5640_vga( input clk_50M, input reset_n, output [3:0] led, //led灯指示 ... input camera_vsync, //cmos vsync
SPI,是英语Serial Peripheral Interface的缩写,顾名思义就是串行外围设备接口。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供...
重新一下AS就行了,这个坑等官方后面修复error : The named parameter 'colors' isn 't definederror: The named parameter ' offset ' isn' t definederror : The named parameter 'vsync' isn
包括基本的1602控制,以及使用1602显示电机转速。基本的12864程序,以及使用FSMC控制SSD1289等,资料比较多请自行下载
assign vsync = vsync_r; //-------------------------------------------------- //显示一个矩形框 wire a_dis,b_dis,c_dis,d_dis; //矩形框显示区域定位 assign a_dis = ( (xpos>=200) && (xpos) ) && ( ...