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

目录:

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线程有:

62f4f0c36dd22adae44e825aa89d7c4a.png

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

440d63a4b636b4f04c175f53fc5a5594.png

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

9da0533cb48359187788896021db8030.png

每个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层

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值