当前位置: 首页 > news >正文

建设电子商务网站所应用的技术海尔建设此网站的目的

建设电子商务网站所应用的技术,海尔建设此网站的目的,分析网站建设到运营需要多少钱,免费有趣的网站目录#xff1a;Android显示终极宝典 在前面的章节中#xff0c;应用通过createSurface()在surfaceflinger中创建了一层layer#xff0c;紧接着要做的事情就是对这个layer设置一些属性#xff08;或者叫状态#xff09;#xff0c;常设置的属性有位置、大小、z-order等等…目录Android显示终极宝典 在前面的章节中应用通过createSurface()在surfaceflinger中创建了一层layer紧接着要做的事情就是对这个layer设置一些属性或者叫状态常设置的属性有位置、大小、z-order等等。那么client端是如何设置到surfaceflinger中的呢Android12引入了Transaction机制来传递这些属性到surfaceflinger对应的layer中。 画个简图如下 本节先从client端开始看client端主要看三个内容 layer_state_tregisterSurfaceControlForCallback()apply() 这三个内容是Transaction的核心我们逐一来看一下。 layer_state_t Transaction中还有一类直接针对display设置状态的接口这里我们就不看了主要看下layer的内容。 Transaction所有针对layer的接口的共性目的都是在设置layer_state_t这个结构体对应到surfaceflinger中则是将所设置的属性保存到layer的mDrawingState中。 //frameworks/native/libs/gui/SurfaceComposerClient.cpp SurfaceComposerClient::Transaction SurfaceComposerClient::Transaction::setLayer(const spSurfaceControl sc, int32_t z) {layer_state_t* s getLayerState(sc);if (!s) {mStatus BAD_INDEX;return *this;}s-what | layer_state_t::eLayerChanged;s-what ~layer_state_t::eRelativeLayerChanged;s-z z;registerSurfaceControlForCallback(sc);return *this; } 另外一点从代码中可以看到大部分接口都会去调用registerSurfaceControlForCallback()这个接口这个接口看似代码量很少但是由其牵扯出的逻辑还是比较复杂的需要一点一点展开来看一看吧。 registerSurfaceControlForCallback() //frameworks/native/libs/gui/SurfaceComposerClient.cpp void SurfaceComposerClient::Transaction::registerSurfaceControlForCallback(const spSurfaceControl sc) {auto callbackInfo mListenerCallbacks[TransactionCompletedListener::getIInstance()];callbackInfo.surfaceControls.insert(sc);TransactionCompletedListener::getInstance()-addSurfaceControlToCallbacks(sc, callbackInfo.callbackIds); } 看代码可以得到的信息有只要只调用了这个接口那么mListenerCallbacks就会有值且将SurfaceControl保存到其CalllbackInfo的SurfaceControls成员中。 然后进程中还创建了一个TransactionCompletedListener单例后面会传递给surfaceflinger而surfaceflinger在处理完transaction后则会回调这个listener。 接着看下addSurfaceControlToCallbacks() //frameworks/native/libs/gui/SurfaceComposerClient.cpp void TransactionCompletedListener::addSurfaceControlToCallbacks(const spSurfaceControl surfaceControl,const std::unordered_setCallbackId, CallbackIdHash callbackIds) {std::lock_guardstd::mutex lock(mMutex);for (auto callbackId : callbackIds) {mCallbacks[callbackId].surfaceControls.emplace(std::piecewise_construct,std::forward_as_tuple(surfaceControl-getHandle()),std::forward_as_tuple(surfaceControl));} }这个函数的目的是依据registerSurfaceControlForCallback()传进来的SurfaceControl和callbackIds用来构建出listener内部成员mCallbacks的valuecallbackTranslation中的surfaceControls。但是一般情况下传进来的callbackIds是空值所以addSurfaceControlToCallbacks()在一般情况下什么也不会做。只有等到addTransactionCallback()被调用后callbackIds中才有值在此后addSurfaceControlToCallbacks()才会做有意义的事情。 接着看看addTransactionCallback() //frameworks/native/libs/gui/SurfaceComposerClient.cpp SurfaceComposerClient::Transaction SurfaceComposerClient::Transaction::addTransactionCallback(TransactionCompletedCallbackTakesContext callback, void* callbackContext,CallbackId::Type callbackType) {auto listener TransactionCompletedListener::getInstance();auto callbackWithContext std::bind(callback, callbackContext, std::placeholders::_1,std::placeholders::_2, std::placeholders::_3);const auto surfaceControls mListenerCallbacks[TransactionCompletedListener::getIInstance()].surfaceControls;CallbackId callbackId listener-addCallbackFunction(callbackWithContext, surfaceControls, callbackType);mListenerCallbacks[TransactionCompletedListener::getIInstance()].callbackIds.emplace(callbackId);return *this; } 先不急着分析它内部的代码先来看看这个函数被谁调用。搜索code发现它会被addTransactionCompletedCallback()和addTransactionCommittedCallback()调用而 addTransactionCommittedCallback()会被CTS测试code调用。addTransactionCompletedCallback()会被BLASTBufferQueue和CTS测试code调用。 BLASTBufferQueue会在processNextBufferLocked()的时候将transactionCallbackThunk()注册传递给addTransactionCompletedCallback()函数。第一个参数就是transactionCallbackThunk()第二个参数是BLASTBufferQueue的this指针第三个参数是CallbackId::Type::ON_COMPLETE。 现在正式来看addTransactionCallback()的代码做的事情 首先它会将传进来的callback重新打包成callbackWithContext再者获取Transaction的mListenerCallbacks内部保存的surfaceControls然后调用addCallbackFunction()将构建的callbackWithContext和获取到的surfaceControls分别保存到CallbackTranslation中并且返回一个callbackId最后将上面返回的callbackId保存到Transaction的mListenerCallbacks的CallbackInfo的callbackIds成员中。 到这里registerSurfaceControlForCallback()就结束了它的主要作用是将BLASTBufferQueue和TransactionCompletedListener联系起来。TransactionCompletedListener是基于binder实现的它被传递给surfaceflinger完成传递步骤则是在apply()方法内了。 apply() //frameworks/native/libs/gui/SurfaceComposerClient.cpp status_t SurfaceComposerClient::Transaction::apply(bool synchronous) {if (mStatus ! NO_ERROR) {return mStatus;}spISurfaceComposer sf(ComposerService::getComposerService());bool hasListenerCallbacks !mListenerCallbacks.empty();std::vectorListenerCallbacks listenerCallbacks;// For every listener with registered callbacksfor (const auto [listener, callbackInfo] : mListenerCallbacks) {auto [callbackIds, surfaceControls] callbackInfo;if (callbackIds.empty()) {continue;}if (surfaceControls.empty()) {listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds));} else {// If the listener has any SurfaceControls set on this Transaction update the surface// statefor (const auto surfaceControl : surfaceControls) {layer_state_t* s getLayerState(surfaceControl);if (!s) {ALOGE(failed to get layer state);continue;}std::vectorCallbackId callbacks(callbackIds.begin(), callbackIds.end());s-what | layer_state_t::eHasListenerCallbacksChanged;s-listeners.emplace_back(IInterface::asBinder(listener), callbacks);}}}cacheBuffers();VectorComposerState composerStates;VectorDisplayState displayStates;uint32_t flags 0;mForceSynchronous | synchronous;for (auto const kv : mComposerStates){composerStates.add(kv.second);}displayStates std::move(mDisplayStates);if (mForceSynchronous) {flags | ISurfaceComposer::eSynchronous;}if (mAnimation) {flags | ISurfaceComposer::eAnimation;}// If both mEarlyWakeupStart and mEarlyWakeupEnd are set// it is equivalent for noneif (mEarlyWakeupStart !mEarlyWakeupEnd) {flags | ISurfaceComposer::eEarlyWakeupStart;}if (mEarlyWakeupEnd !mEarlyWakeupStart) {flags | ISurfaceComposer::eEarlyWakeupEnd;}spIBinder applyToken mApplyToken? mApplyToken: IInterface::asBinder(TransactionCompletedListener::getIInstance());sf-setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,{} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,hasListenerCallbacks, listenerCallbacks, mId);mId generateId();// Clear the current states and flagsclear();mStatus NO_ERROR;return NO_ERROR; } apply()一般不会传入参数所以通常它的参数固定为false。 第一个for循环的作用很单纯就是将transaction中保存的listener存入Surfacecontrol对应layer_state_t即listeners成员中去。 cacheBuffers()实际上是做了一个策略如果这个surface是带buffer的那么会在transaction内部创建一个BufferCache保存buffer的mId并且后面随transaction一起传递的也是这个mId保存在cachedBuffer.id成员中。 接下来是对flags的设定eSynchronous的值由apply()的参数和setDisplayProjection()接口来决定一般情况不会设定。eAnimation、eEarlyWakeupStart和eEarlyWakeupEnd都是由WMS来设定的在WMS处理窗口动画效果的时候会去设置。 然后调用surfaceflinger的setTransactionState()接口将应用设置的所有信息传递给它传递的最后一个参数是一个自增的mId可以通过这个id值来快速确认client和server直接的调用对应关系。 最后调用clear()清理掉该transaction涉及到传递的所有成员变量的值。也就是说一个进程在apply()完以后要重新使用这个transaction则必须重新设置layer_state_t和DisplayState。 到此client端的Transaction就讲完了后面继续学习下surfaceflinger端是如何处理transaction的。 TransactionCompletedListener 这里简单描述下TransactionCompletedListener是如何被回调的。 surfaceflinger端这里不讲这里直接掐头去尾直接讲和本节相关的。在setClientStateLocked()函数中会调用TransactionCallbackInvoker的startRegistration()方法将listener保存到mCompletedTransactions中。然后在surfaceflinger处理完transaction后会在handleMessageInvalidate()中调用TransactionCallbackInvoker的sendCallbacks()去回调TransactionCompletedListener的onTransactionCompleted()函数。接着回调callbackFunction()一路回调到BLASTBufferQueue再到JAVA层。 总结 Transaction的作用是提供给应用统一设置所有需要设置的layer或者display的状态值以原子操作的形式发送给surfacefinger进行处理如果应用设置了回调那么surfacefinger在处理完transaction后会将消息回调到上层。
文章转载自:
http://www.morning.fewhope.com.gov.cn.fewhope.com
http://www.morning.cmcjp.cn.gov.cn.cmcjp.cn
http://www.morning.hnkkf.cn.gov.cn.hnkkf.cn
http://www.morning.tjwlp.cn.gov.cn.tjwlp.cn
http://www.morning.zbmcz.cn.gov.cn.zbmcz.cn
http://www.morning.rfbt.cn.gov.cn.rfbt.cn
http://www.morning.knsmh.cn.gov.cn.knsmh.cn
http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn
http://www.morning.ldspj.cn.gov.cn.ldspj.cn
http://www.morning.ykgp.cn.gov.cn.ykgp.cn
http://www.morning.kdnrc.cn.gov.cn.kdnrc.cn
http://www.morning.fjptn.cn.gov.cn.fjptn.cn
http://www.morning.rsjng.cn.gov.cn.rsjng.cn
http://www.morning.smszt.com.gov.cn.smszt.com
http://www.morning.jmmz.cn.gov.cn.jmmz.cn
http://www.morning.fkflc.cn.gov.cn.fkflc.cn
http://www.morning.jcypk.cn.gov.cn.jcypk.cn
http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn
http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn
http://www.morning.jhrkm.cn.gov.cn.jhrkm.cn
http://www.morning.qstjr.cn.gov.cn.qstjr.cn
http://www.morning.nlrp.cn.gov.cn.nlrp.cn
http://www.morning.crfjj.cn.gov.cn.crfjj.cn
http://www.morning.snktp.cn.gov.cn.snktp.cn
http://www.morning.rwdbz.cn.gov.cn.rwdbz.cn
http://www.morning.rwnx.cn.gov.cn.rwnx.cn
http://www.morning.lkbyj.cn.gov.cn.lkbyj.cn
http://www.morning.kxqwg.cn.gov.cn.kxqwg.cn
http://www.morning.nlygm.cn.gov.cn.nlygm.cn
http://www.morning.qgjgsds.com.cn.gov.cn.qgjgsds.com.cn
http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn
http://www.morning.jnhhc.cn.gov.cn.jnhhc.cn
http://www.morning.brwei.com.gov.cn.brwei.com
http://www.morning.hqbnx.cn.gov.cn.hqbnx.cn
http://www.morning.bnxfj.cn.gov.cn.bnxfj.cn
http://www.morning.kbntl.cn.gov.cn.kbntl.cn
http://www.morning.jmwrj.cn.gov.cn.jmwrj.cn
http://www.morning.c7513.cn.gov.cn.c7513.cn
http://www.morning.hrdx.cn.gov.cn.hrdx.cn
http://www.morning.jnzfs.cn.gov.cn.jnzfs.cn
http://www.morning.nnrqg.cn.gov.cn.nnrqg.cn
http://www.morning.mtjwp.cn.gov.cn.mtjwp.cn
http://www.morning.mlyq.cn.gov.cn.mlyq.cn
http://www.morning.hwljx.cn.gov.cn.hwljx.cn
http://www.morning.jzmqk.cn.gov.cn.jzmqk.cn
http://www.morning.hcwlq.cn.gov.cn.hcwlq.cn
http://www.morning.tyrlk.cn.gov.cn.tyrlk.cn
http://www.morning.rnxw.cn.gov.cn.rnxw.cn
http://www.morning.fphbz.cn.gov.cn.fphbz.cn
http://www.morning.xqndf.cn.gov.cn.xqndf.cn
http://www.morning.kzslk.cn.gov.cn.kzslk.cn
http://www.morning.ygrdb.cn.gov.cn.ygrdb.cn
http://www.morning.zqfz.cn.gov.cn.zqfz.cn
http://www.morning.sjbpg.cn.gov.cn.sjbpg.cn
http://www.morning.lbrrn.cn.gov.cn.lbrrn.cn
http://www.morning.yghlr.cn.gov.cn.yghlr.cn
http://www.morning.kxypt.cn.gov.cn.kxypt.cn
http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn
http://www.morning.xjmpg.cn.gov.cn.xjmpg.cn
http://www.morning.lzbut.cn.gov.cn.lzbut.cn
http://www.morning.sblgt.cn.gov.cn.sblgt.cn
http://www.morning.ypdmr.cn.gov.cn.ypdmr.cn
http://www.morning.gwqq.cn.gov.cn.gwqq.cn
http://www.morning.xpqdf.cn.gov.cn.xpqdf.cn
http://www.morning.bpwdc.cn.gov.cn.bpwdc.cn
http://www.morning.jqmmf.cn.gov.cn.jqmmf.cn
http://www.morning.feites.com.gov.cn.feites.com
http://www.morning.zztmk.cn.gov.cn.zztmk.cn
http://www.morning.rydhq.cn.gov.cn.rydhq.cn
http://www.morning.fgrkc.cn.gov.cn.fgrkc.cn
http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com
http://www.morning.nqbcj.cn.gov.cn.nqbcj.cn
http://www.morning.xrnh.cn.gov.cn.xrnh.cn
http://www.morning.qqpg.cn.gov.cn.qqpg.cn
http://www.morning.qxjck.cn.gov.cn.qxjck.cn
http://www.morning.xjpnq.cn.gov.cn.xjpnq.cn
http://www.morning.ssxlt.cn.gov.cn.ssxlt.cn
http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn
http://www.morning.pybqq.cn.gov.cn.pybqq.cn
http://www.morning.tndxg.cn.gov.cn.tndxg.cn
http://www.tj-hxxt.cn/news/243800.html

相关文章:

  • 兰州公司做网站的价格wordpress 当前文章id
  • 厦门市建设局网站摇号自己做的网站提示不安全吗
  • 网站开发需要看什么书国外做的比较好的网站有哪些
  • 广州建网站白云区盘锦网站变建设
  • 汕头网站设计哪家好适合女人小成本开店
  • 百度右侧相关网站app 网站 优势
  • 开广告店要懂哪些技术百度seo站长
  • 深圳网站制作哪里好贵阳建设工程招投标网站
  • 重庆南岸区网站建设莘县聊城做网站
  • 甜蜜高端定制网站怎样做的网站内网外网都能用
  • 广州企业建站素材门户网站系统程序
  • 网站建设实施计划包括住房及城乡建设部信息中心网站
  • 易搜搜索引擎图片网站的优化
  • 东莞塘厦网站建设网页制作软件教程
  • 创业网站怎么做的谷歌搜索广告
  • 医院网站建设怎么设置广东网站建设找
  • 琼筑网站是哪家做的西安百度seo排名软件
  • 横山专业做网站建设的公司元宇宙软件开发
  • 网站汉英结合的怎么做行业型网站 赢利点
  • php网站建设教程 电子书公司部门解散调岗不同意有赔偿吗
  • 莱州相亲网站有什么网站是做平面设计的
  • 网站内容seo泰安企业网站建设
  • 网站搭建规划个人养老保险怎么买合适
  • 太原网站设计开发公司免费博客网站
  • 网站建设毕业设计中期进度报告建设银行网站 开户行怎么查
  • 网站备案管理系统登录不上去wordpress访问加密
  • 为什么最近好多网站打不开了做网页网站需要钱吗
  • 机械类网站模板做网站需要下载啥
  • seo营销网站的设计标准湛江人才网招聘官方网
  • 做网站美工h5科技 网站