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

西安seo站内优化企业网站建设一条龙

西安seo站内优化,企业网站建设一条龙,百度秒收录神器,如何确定网站栏目上一篇文章介绍了 onFrameAvailable() 函数的流程#xff0c;最终回调到了 BLASTBufferQueue 中#xff0c;这里测处理跟 Android 老版本还是有区别的#xff0c;在 BLASTBufferQueue 中通过提交事务的方式通知 SurfaceFlinger 进行更新#xff0c;而不是老版本中的直接调用…         上一篇文章介绍了 onFrameAvailable() 函数的流程最终回调到了 BLASTBufferQueue 中这里测处理跟 Android 老版本还是有区别的在 BLASTBufferQueue 中通过提交事务的方式通知 SurfaceFlinger 进行更新而不是老版本中的直接调用 SurfaceFlinger 中的对应函数。这里我们就来看一下 提交事务的通知流程。 一、提交事务 上一篇文章中的  t-setApplyToken(mApplyToken).apply() 其实调用的就是 SurfaceComposerClient 中的 apply() 函数。 1、SurfaceComposerClient.cpp  源码位置/frameworks/native/libs/gui/SurfaceComposerClient.cpp  status_t SurfaceComposerClient::Transaction::apply(bool synchronous, bool oneWay) {……// 获取 SurfaceComposer 服务spISurfaceComposer sf(ComposerService::getComposerService());bool hasListenerCallbacks !mListenerCallbacks.empty();std::vectorListenerCallbacks listenerCallbacks;// 处理监听器回调for (const auto [listener, callbackInfo] : mListenerCallbacks) {auto [callbackIds, surfaceControls] callbackInfo;……if (surfaceControls.empty()) {listenerCallbacks.emplace_back(IInterface::asBinder(listener), std::move(callbackIds));} else {// 如果侦听器在此事务上设置了任何surfacecontrol则更新Surface状态for (const auto surfaceControl : surfaceControls) {layer_state_t* s getLayerState(surfaceControl);……std::vectorCallbackId callbacks(callbackIds.begin(), callbackIds.end());s-what | layer_state_t::eHasListenerCallbacksChanged;s-listeners.emplace_back(IInterface::asBinder(listener), callbacks);}}}……// 提交事务sf-setTransactionState(mFrameTimelineInfo, composerStates, displayStates, flags, applyToken,mInputWindowCommands, mDesiredPresentTime, mIsAutoTimestamp,{} /*uncacheBuffer - only set in doUncacheBufferTransaction*/,hasListenerCallbacks, listenerCallbacks, mId);…… } 该方法是 SurfaceFlinger 客户端与服务端通信的关键部分用于提交所有待处理的层和显示更改。通过这个方法客户端可以控制层的显示属性、动画、同步模式以及监听器回调等确保所有更改被原子性地应用到系统中。  2、SurfaceFlinger.cpp 源码位置/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp setTransactionState status_t SurfaceFlinger::setTransactionState(const FrameTimelineInfo frameTimelineInfo, const VectorComposerState states,const VectorDisplayState displays, uint32_t flags, const spIBinder applyToken,const InputWindowCommands inputWindowCommands, int64_t desiredPresentTime,bool isAutoTimestamp, const client_cache_t uncacheBuffer, bool hasListenerCallbacks,const std::vectorListenerCallbacks listenerCallbacks, uint64_t transactionId) {……IPCThreadState* ipc IPCThreadState::self();const int originPid ipc-getCallingPid();const int originUid ipc-getCallingUid();// 记录事务状态。创建一个 TransactionState 结构体封装了事务的所有必要信息TransactionState state{frameTimelineInfo, states,displays, flags,applyToken, inputWindowCommands,desiredPresentTime, isAutoTimestamp,uncacheBuffer, postTime,permissions, hasListenerCallbacks,listenerCallbacks, originPid,originUid, transactionId};……if (mTransactionTracing) {mTransactionTracing-addQueuedTransaction(state);}// 将事务加入队列准备处理。queueTransaction(state);// 检查挂起状态以确保事务是同步的.if (state.transactionCommittedSignal) {waitForSynchronousTransaction(*state.transactionCommittedSignal);}return NO_ERROR; } 该方法是 SurfaceFlinger 服务端处理来自客户端事务请求的关键入口点。它不仅处理事务数据还执行必要的权限检查确保只有授权的客户端才能执行特定的操作。此外它还支持事务的同步和异步执行以及事务的追踪这对于系统稳定性和性能优化至关重要。  queueTransaction  void SurfaceFlinger::queueTransaction(TransactionState state) {state.queueTime systemTime();Mutex::Autolock lock(mQueueLock);……// 加入事务队列mTransactionQueue.emplace_back(state);ATRACE_INT(TransactionQueue, mTransactionQueue.size());// 根据事务的标志位state.flags调用schedule lambda函数确定事务的调度策略const auto schedule [](uint32_t flags) {if (flags eEarlyWakeupEnd) return TransactionSchedule::EarlyEnd;if (flags eEarlyWakeupStart) return TransactionSchedule::EarlyStart;return TransactionSchedule::Late;}(state.flags);const auto frameHint state.isFrameActive() ? FrameHint::kActive : FrameHint::kNone;// 设置事务标志setTransactionFlags(eTransactionFlushNeeded, schedule, state.applyToken, frameHint); } 该方法是 SurfaceFlinger 处理事务队列的核心部分它不仅负责将事务加入队列还根据事务的特性和需求调整了事务的调度策略确保了事务能够按照预期的顺序和优先级得到处理。通过这种方式SurfaceFlinger 能够有效地管理多个并发事务保证系统的响应性和稳定性。  3、Scheduler 源码位置/frameworks/native/services/surfaceflinger/Scheduler/Scheduler.h schedule // 在主线程上调度异步或同步任务 template typename F, typename T std::invoke_result_tF [[nodiscard]] std::futureT schedule(F f) {// 创建Taskauto [task, future] makeTask(std::move(f));// 接收一个任务对象并将其发送到消息队列中postMessage(std::move(task));return std::move(future); } 该函数允许用户以一种简洁的方式异步执行代码并通过 std::future 管理异步操作的结果。这种设计模式在多线程编程中非常常见尤其是在需要处理大量异步事件和任务的场景中。这里调用了 makeTask() 创建任务并将其发送到消息队列中。 Scheduler 源码位置/frameworks/native/services/surfaceflinger/Scheduler/Scheduler.cpp Scheduler::Scheduler(ICompositor compositor, ISchedulerCallback callback, FeatureFlags features): impl::MessageQueue(compositor), mFeatures(features), mSchedulerCallback(callback) {} 可以看到 Scheduler 继承 MessageQueue所以上面调用的是 MessageQueue 中的 makeTask() 函数。 4、MessageQueue 源码位置/frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.h makeTask template typename F inline auto makeTask(F f) {spTaskF task new TaskF(std::move(f));return std::make_pair(task, task-mTask.get_future()); } 这里将一个可调用对象 f 封装成一个可以异步执行的任务并返回一个包含任务对象和一个 std::future 对象的 std::pair。 template typename F class Task : public MessageHandler {template typename Gfriend auto makeTask(G);explicit Task(F f) : mTask(std::move(f)) {}void handleMessage(const Message) override { mTask(); }using T std::invoke_result_tF;std::packaged_taskT() mTask; }; 这里可以看到上面的任务消息最终会在 handleMessage() 函数中进行处理。即 Scheduler.cpp 的  handleMessage() 函数中。 handleMessage 源码位置/frameworks/native/services/surfaceflinger/Scheduler/MessageQueue.cpp MessageQueue::MessageQueue(ICompositor compositor): MessageQueue(compositor, spHandler::make(*this)) {}void MessageQueue::Handler::handleMessage(const Message) {// 更新帧待处理状态mFramePending.store(false);const nsecs_t frameTime systemTime();auto compositor mQueue.mCompositor;// 提交当前帧if (!compositor.commit(frameTime, mVsyncId, mExpectedVsyncTime)) {return;}// 合成帧compositor.composite(frameTime, mVsyncId);// 采样compositor.sample(); } 该方法的流程反映了典型的帧渲染管线的一部分包括帧提交、合成和采样等关键步骤。这些操作通常在接收到 VSync 信号或其他触发消息时执行确保了屏幕内容的及时更新和渲染效率。而这里的 ICompositor 是 SurfaceFlinger 在初始化 Scheduler 时传进来的参数。 5、SurfaceFlinger.cpp initScheduler void SurfaceFlinger::initScheduler(const spDisplayDevice display) {mScheduler std::make_uniquescheduler::Scheduler(static_castICompositor(*this),static_castISchedulerCallback(*this), features);{auto configs display-holdRefreshRateConfigs();……mScheduler-createVsyncSchedule(features);mScheduler-setRefreshRateConfigs(std::move(configs));}setVsyncEnabled(false);mScheduler-startTimers();…… } 所以上面的 compositor.XXX() 调用的是 SurfaceFlinger 总的对应方法这就与 SurfaceFlinger 核心类建立了连接。
http://www.zqtcl.cn/news/539245/

相关文章:

  • 网站建设法规浙江建设信息港证书查询
  • 影视作品网站开发与设计网站建设教程简笔画
  • 自己可以给公司做网站吗网站建设 用ftp上传文件
  • 电子商务网站开发与管理网站建设的设备
  • 网站建设项目公司沈阳网站关键字优化
  • 可以做淘宝联盟的免费网站优质国外网站
  • 石家庄营销型网站建设公司服装公司网站源码
  • 网站开发的软硬件需求做网站盘锦
  • 创意网站建设排行榜python和php哪个做网站
  • 开锁做网站怎么样榆林网站开发公司
  • 松原市建设局网站苏州网站建设-中国互联
  • 标书制作教程视频网站福田祥菱v1单排
  • 点网站出图片怎么做能看人与动物做的网站
  • 免费开源建站系统源码wordpress公共函数在哪里
  • 西昌市建设工程管理局网站模块化网站开发
  • 无限看片的视频大全免费下载上海网络优化方法
  • 物流公司做网站注重什么问题中国建设银行征信中心网站
  • 教务处网站建设专业做鞋子的网站吗
  • 梦幻创意网站建设成都做网站设计哪家便宜
  • 织梦网站栏目修改教程丝绸之路网站建设意义
  • 如何知道一个网站是谁做的北京装饰公司前十名
  • 杭州网站建设哪个平台好visualstudio 做网站
  • 广州站是哪个站h5建站系统
  • 网站首页网址应该有对应的域名南京高端模板建站
  • 自己做的网站竞价优化怎么做网站流量赚钱吗
  • 人力资源网站建设mip网站模板
  • 太原市住房和城乡建设部网站网站 备案 换空间
  • 怎么做网站备份网站运营数据周报表怎么做
  • 度更新网站做详情页网站
  • 酷炫网站模板wordpress自动发货插件