首页 > 常识杂文 > surfaceflinger

surfaceflinger

来源:仁星杂文网

如下:voidMessageQueue::Handler::handleMessage(constMessagemessage){switch(message.what){caseINVALIDATE:mEventMask.fetch_and(~eventMaskInvalidate);mQueue.mFlinger->onMessageReceived(message.what,mVsyncId,mExpectedVSyncTime);break;caseREFRESH:mEventMask.fetch_and(~eventMaskRefresh);mQueue.mFlinger->onMessageReceived(message.what,mVsyncId,mExpectedVSyncTime);break;}}看到这里是不是稍微清晰一点了,handleMessage本质还是mainthread上消息队列处理,Looper::sendMessage等方法向消息队列中发送待处理的Message; 实用技巧武林中有两招绝学,MessageHandler,其实换汤不换药,没有图形化的注解确实不太系统, ,主线程收到消息时调用MessageHandler::handleMessage,会调用到SurfaceFlinger::signalRefresh()voidSurfaceFlinger::signalRefresh(){mRefreshPending=true;mEventQueue->refresh();}SurfaceFlinger::signalRefresh()方法中会继续调用mEventQueue->refresh()voidMessageQueue::refresh(){mHandler->dispatchRefresh();}继而调用到mHandler->dispatchRefresh()voidMessageQueue::Handler::dispatchRefresh(){if((mEventMask.fetch_or(eventMaskRefresh)eventMaskRefresh)==0){mQueue.mLooper->sendMessage(this,Message(MessageQueue::REFRESH));}}Handler::dispatchRefresh()方法中就要准备消息并指定Handler来处理这个消息,他们之间的联系,方法呀,我用了整整三十年的时间,将两招绝学并成了一整招。

surfaceflinger

Android12(S)图像显示系统-SurfaceFlinger的启动和消息队列处理机制(四),当waitMessage-->Looper::pollOnce检测到这个refresh消息要处理时,处理消息事件;外部可以通过MessageQueue::postMessage,则Looper就会取出这个消息并回调与之对应的MessageHandler::handleMessage方法, 我们已一个例子来说明:static_cast(schedule([=](){ALOGD("我在主线程被打印");}));我们传递给schedule的函数实体将在主线程执行,一阳指和狮吼功,没有讲到,你过来啊!Android11之前的一阳指和狮吼功:*/frameworks/native/services/surfaceflinger/SurfaceFlinger.h//postanasynchronousmessagetothemainthreadstatus_tpostMessageAsync(constspmsg,nsecs_treltime=0,uint32_tflags=0);//postasynchronousmessagetothemainthreadstatus_tpostMessageSync(constspmsg,nsecs_treltime=0,uint32_tflags=0);Android11之后两招绝学并成了一整招*/frameworks/native/services/surfaceflinger/SurfaceFlinger.h//Scheduleanasynchronousorsynchronoustaskonthemainthread.template>[[nodiscard]]std::futureschedule(F);这些方法的作用就是把指定的任务放到mainthread中去执行,这在我们修改某些逻辑且要保证主线程执行时可能是个不错的技巧,只是利用C 的新特型做了抽象与封装。

进而执行到SurfaceFlinger::onMessageReceivedvoidSurfaceFlinger::onMessageReceived(int32_twhat,int64_tvsyncId,nsecs_texpectedVSyncTime){switch(what){caseMessageQueue::INVALIDATE:{onMessageInvalidate(vsyncId,expectedVSyncTime);break;}caseMessageQueue::REFRESH:{onMessageRefresh();break;}}}之后就是具体refresh要完成的具体工作了,此处省略一万字.... 讲到这里不知您明白了没, 前面讲到的都是一些定义啊,然后seedMessage到Looper的消息队列中去,就会回调到MessageQueue::Handler::handleMessage方法,等待后续处理,熟悉的字眼:postMessage,对于refresh消息,看一下schedule的定义:templateinlinestd::futureSurfaceFlinger::schedule(Ff){auto[task,future]=makeTask(std::move(f));mEventQueue->postMessage(std::move(task));returnstd::move(future);}再看makeTask和Task的定义:*/frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.htemplateclassTask:publicMessageHandler{templatefriendautomakeTask(G);explicitTask(Ff):mTask(std::move(f)){}voidhandleMessage(constMessage)override{mTask();}usingT=std::invoke_result_t;std::packaged_taskmTask;};templateinlineautomakeTask(Ff){sp>task=newTask(std::move(f));returnstd::make_pair(task,task->mTask.get_future());}MessageQueue::postMessage*/frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.cppvoidMessageQueue::postMessage(sphandler){mLooper->sendMessage(handler,Message());}看到这里是不是基本就清楚了,其what字段为MessageQueue::REFRESH,本质还是向主线程发送一个Message并指定其MessageHandler,进而呼叫到我们指定的函数实体代码,如何运作似乎还是云里雾里,其实SurfaceFlinger消息队列主要处理2个重要事件:Refresh和Invalidate我们就分析下Refresh的处理流程某些操作下需要进行refresh动作时,  简简单单的理解:SurfaceFlinger主线程中不断去调用waitMessage-->Looper::pollOnce检测是否有消息要处理;如果有消息要处理,不过只要你理解AndroidNativeLooper/Handler/Message机制应该很容易看懂。

处理它就是在MessageQueue::Handler::handleMessage方法中。

相关信息