目录:

0.mtk平台相关surfaceflinger线程有那些?

1 mtk采用的是:硬件VSYNC线程

2.Mtk通过surfaceflinger注册了3个eventthread

2.1DispSyncThread如何区分和执行vssyncsrc和sfVsyncSrc的vs?

2.2 vssyncsrc和sfVsyncSrc的事件接受者什么创建

2.3EventControl线程

//

0.mtk平台相关surfaceflinger线程有:

1 mtk采用的是:硬件VSYNC线程:

2.Mtk通过surfaceflinger注册了3个eventthread:

每个event线程都注册:

voidEventThread::Connection::onFirstRef() {

// NOTE: mEventThread doesn't hold a strongreference on us

mEventThread->registerDisplayEventConnection(this);

}

线程

VS信号源

功能

eventthread:

vssyncsrc硬件VS

用于控制App UI的同步,产生sfVsyncSrc的周期:sfVsyncPhaseOffsetNs。在setVSyncEnabled()的时候mDispSync->addEventListener()来设置周期

Eventthread

sfVsyncSrc

与surfaceflinger的渲染同步,产生vssyncsrc的周期是:vsyncPhaseOffsetNs。在setVSyncEnabled()的时候mDispSync->addEventListener()来设置周期

EventControl

用来向VSync硬件发命令,只是使能和关闭硬件vs信号

DispSync线程

vssyncsrc硬件VS

统一处理硬件产生的vs信号,以及计算帧时间

理论上来说:vssyncsrc和sfVsyncSrc都是虚拟的vs。两者都是通过DispSync线程来计算发出vs的时间。

2.1DispSyncThread如何区分和执行vssyncsrc和sfVsyncSrc的VsyncSrc?

答案:

1)首先VSyncSource对象的创建如下

// start the EventThread

sp vsyncSrc =new DispSyncSource(&mPrimaryDispSync,返回一个DispSyncSource对象给vsyncSrc

vsyncPhaseOffsetNs, true);

mEventThread = new EventThread(vsyncSrc);

spsfVsyncSrc =new DispSyncSource(&mPrimaryDispSync,----返回一个DispSyncSource对象给sfVsyncSrc

sfVsyncPhaseOffsetNs, false);

mSFEventThread = newEventThread(sfVsyncSrc);

mEventQueue.setEventThread(mSFEventThread);

-------也就是每个EventThread都是有管理自己的对象vsyncSrc或者sfVsyncSrc;

---------EventThread::threadLoop-------

{

……...

-waitForEvent()

…...

}

//增加监听者以及设置接收到vsync的时候callbakc

waitForEvent(){

…..

// Here we figure outif we need to enable or disable vsyncs

if (timestamp && !waitForVSync){

// we received a VSYNC but we haveno clients

// don't report it, and disableVSYNC events

disableVSyncLocked();

} else if (!timestamp &&waitForVSync) {

// we have at least one client, sowe want vsync enabled

// (TODO: this function is calledright after we finish

// notifying clients of a vsync, sothis call will be made

// at the vsync rate, e.g.60fps.  If we can accurately

// track the current state we couldavoid making this call

// so often.)

enableVSyncLocked();

}

………

}

void EventThread::enableVSyncLocked() {

if (!mUseSoftwareVSync) {

// never enable h/w VSYNC when screenis off

if (!mVsyncEnabled) {

mVsyncEnabled = true;

/*设置回调VSyncSource::Callback的onVSyncEvent是纯虚函数:EventThread继承自VSyncSource::Callback。实现了onVSyncEvent()回调函数。

//classEventThread : public Thread, private VSyncSource::Callback

最终:mCallback= callback;

virtual voidsetCallback(const sp<:callback>& callback) {

Mutex::Autolock lock(mMutex);

mCallback = callback;

}

*/

mVSyncSource->setCallback(static_cast<:callback>(this));

mVSyncSource->setVSyncEnabled(true);-----》这侧监听者到mEventListeners

mPowerHAL.vsyncHint(true);

}

}

mDebugVsyncEnabled = true;

}

2)其次硬件常常一个VS--->通知到SurfaceFlinger::onVSyncReceived(inttype, nsecs_ttimestamp)//timestamp就是用来计算这次vs的周期:mPeriod;而mPeriod就是DispSync线程的执行周期。

virtual bool threadLoop() {

status_t err;

nsecs_t now =systemTime(SYSTEM_TIME_MONOTONIC);

nsecs_t nextEventTime = 0;

while (true) {

VectorcallbackInvocations;

………...

if (mPeriod == 0) {

err = mCond.wait(mMutex);//周期超时,则wait,直到下一次HW VS产生

if (err != NO_ERROR) {

ALOGE("errorwaiting for new events: %s (%d)",

strerror(-err),err);

return false;

}

continue;

}

。。。。。。。。。

if (isWakeup) {

mWakeupLatency =((mWakeupLatency * 63) +

(now - targetTime))/ 64;

if (mWakeupLatency >500000) {

// Don't correct bymore than 500 us

mWakeupLatency =500000;

}

if (traceDetailedInfo) {

ATRACE_INT64("DispSync:WakeupLat", now - nextEventTime);

ATRACE_INT64("DispSync:AvgWakeupLat", mWakeupLatency);

}

}

//gatherCallbackInvocationsLocked()计算出虚拟VSync信号要多久产生。

callbackInvocations= gatherCallbackInvocationsLocked(now);

}

if (callbackInvocations.size() >0) {

fireCallbackInvocations(callbackInvocations);

//调起监听者的回调函数DispSyncSource::onDispSyncEvent()-----》callback->onVSyncEvent(when);

}

}

return false;

}

voidfireCallbackInvocations(const Vector& callbacks){

for (size_t i = 0; i

callbacks[i].mCallback->onDispSyncEvent(callbacks[i].mEventTime);

}

}

“DispSyncThread就像乐队鼓手一样控制着大家的节奏。它在主循环中会先通过已经向DispSync注册的listener计算下一个要产生的虚拟VSync信号还要多久,等待相应时间后就会调用相应listener的callback函数。这样,对于那些注册了listener的监听者来说,就好像被真实的VSync信号控制着一样。”

小结:相对DispSyncThread而言,vssyncsrc线程和sfVsyncSrc线程是vsync监听者。

而vssyncsrc和sfVsyncSrc收到vsync之后,应用程序和surfaceflinger(两线程循环获取Event)是vsync事件的接收者。

所以vsynv的路径就是:DispSyncThread--->vssyncsrc和sfVsyncSrc---->vsync事件的接收者:应用程序和surfaceflinger.

2.2 vssyncsrc线程和sfVsyncSrc线程的vsync事件接受者什么创建?

1)sfVsyncSrc的vsync事件接收者创建:通过mSFEventThread对象;

mSFEventThread= new EventThread(sfVsyncSrc);

mEventQueue.setEventThread(mSFEventThread);

voidMessageQueue::setEventThread(constsp& eventThread)

{

mEventThread = eventThread;

mEvents =eventThread->createEventConnection();

mEventTube = mEvents->getDataChannel();

mLooper->addFd(mEventTube->getFd(),0, ALOOPER_EVENT_INPUT,

MessageQueue::cb_eventReceiver,this);

}

2)vssyncsrc的vsync事件接收者创建:

应用层通过DisplayEventReceiver.java

--->android_view_DisplayEventReceiver.cpp

--->DisplayEventReceiver.cpp

---->EventThread.cpp

一直到mEventThread对象:

spSurfaceFlinger::createDisplayEventConnection() {

return mEventThread->createEventConnection();

}

2.3EventControl线程

EventControlThread::threadLoop()

---->

mFlinger->eventControl(HWC_DISPLAY_PRIMARY,

SurfaceFlinger::EVENT_VSYNC, mVsyncEnabled);

----->getHwComposer().eventControl(disp, event, enabled);----->HWComposer::eventControl()

----mHwc->eventControl() hal层

android vsync,android display之VSync和线程处理关系相关推荐

  1. android vsync,Android 显示系统:Vsync机制

    一.Vsync简介: 屏幕的刷新过程是每一行从左到右(行刷新,水平刷新,Horizontal Scanning),从上到下(屏幕刷新,垂直刷新,Vertical Scanning).当整个屏幕刷新完毕 ...

  2. Android 显示刷新机制、VSYNC和三重缓存机制

    Android 显示刷新机制.VSYNC和三重缓存机制 为了理解 APP 是如何进行渲染的,我们就必须了解手机硬件是如何工作的,也必须理解什么是 VSYNC. 首先,我们需要了解2个相关概念: 刷新率 ...

  3. android vsync,VSYNC  |  Android 开源项目  |  Android Open Source Project

    VSYNC 信号可同步显示流水线.显示流水线由应用渲染.SurfaceFlinger 合成以及用于在屏幕上显示图像的硬件混合渲染器 (HWC) 组成.VSYNC 可同步应用唤醒以开始渲染的时间.Sur ...

  4. 【Android RTMP】RTMPDump 推流过程 ( 独立线程推流 | 创建推流器 | 初始化操作 | 设置推流地址 | 启用写出 | 连接 RTMP 服务器 | 发送 RTMP 数据包 )

    文章目录 安卓直播推流专栏博客总结 一. Java 层传入的 RTMP 推流地址处理 二. RTMPDump 推流线程 三. 创建 RTMP 对象 四. 初始化 RTMP 对象 五. 设置 RTMP ...

  5. 适用于android 4.0以上版本的子线程网络图片查看器

    android 4.0版本的新特性之一:加载网络内容时会自动判断是否在主线程中运行. 并且获取到内容时不能直接在子线程中设置主线程中的View,会报出以下异常 异常: CalledFromWrongT ...

  6. Android异步加载图像(含线程池,缓存方法)

    研究了android从网络上异步加载图像: (1)由于android UI更新支持单一线程原则,所以从网络上取数据并更新到界面上,为了不阻塞主线程首先可能会想到以下方法. 在主线程中new 一个Han ...

  7. android线程安全ppt,Android 应用程序模块 应用, 任务, 进程, 和线程.ppt

    <Android 应用程序模块 应用, 任务, 进程, 和线程.ppt>由会员分享,可在线阅读,更多相关<Android 应用程序模块 应用, 任务, 进程, 和线程.ppt(12页 ...

  8. Android应用性能优化系列逻辑篇——线程相关性能优化

    线程优化是Android性能优化中一个非常重要的部分,作为进程中逻辑处理调度的基本单位,如果使用不当,非常容易造成系统资源的浪费,从而导致应用性能出问题.在日常开发中,最常出现的问题主要有两个方面,一 ...

  9. Android Qcom lcd display 学习(3)

    Android Display整体架构 Android 图形组件 Android Graphic analyze display:高通display overview MDP(mobile displ ...

  10. Android 7.1.2(Android N) Android系统启动流程

    Android 7.1.2(Android N) Android系统启动流程 源码: system/core/rootdir/ init.rc init.zygote64.rc system/core ...

最新文章

  1. 齐鲁师范学院计算机专业在那个校区,齐鲁师范学院有几个校区及校区地址 哪个校区最好...
  2. mysql timeout知多少
  3. 秒懂INNODB的锁
  4. hibernate继承关系映射方法(一)--共享一张表
  5. spring核心之AOP学习总结二
  6. iOS iphone屏幕分析(岂止而大)
  7. 使用自动机的Lucene新的邻近查询
  8. einops.rearrange、repeat、reduce==>对维度进行操作
  9. python白盒测试_白盒测试方法
  10. Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider
  11. Eclipse/STS 在线安装阿里java代码规约插件
  12. mysql+join的原理,Mysql连接join查询原理知识点
  13. Spring Boot学习
  14. Java里的阻塞队列
  15. 链表去重 保留第一个元素
  16. 百度中文依存句法分析工具DDParser重磅开源
  17. SQL Server树型结构数据处理的存储过程
  18. Spring Framework中的面向方面编程(AOP),第二部分
  19. VMware破解虚拟机内存cpu最大限制
  20. mybatis入门1

热门文章

  1. 数据分析技能点-MySQL表记录的检索
  2. 对自己的检讨与后续期望
  3. 刷脸支付代理加盟需要注意哪些事项
  4. 启动系统服务,错误1053:服务没有及时响应启动或控制请求
  5. 软件测试笔试题你会吗?
  6. java和kotlin哪个更值得学,Kotlin可以不学java吗
  7. Angular之Http+RxJS之WebSocket(网络必备)
  8. 零基础制作【武林外传】辅助工具(三)
  9. android仿微信的activity平滑水平切换动画,Android实现平滑翻动效果
  10. 公务员考试抄袭或协助抄袭者5年内不得报考-公务员-诚信档案