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

SurfaceFlinger MessageQueue原理

SurfaceFlinger MessageQueue 有2个作用:
  1. 处理SurfaceFlinger INVALIDATE、REFRESH事件
  2. 管理SurfaceFlinger主线程挂起和恢复
SurfaceFlinger::run() { 
while (true) { 
mEventQueue->waitMessage(); } } waitMessage {do {IPCThreadState::self()->flushCommands();int32_t ret = mLooper->pollOnce(-1)... } while (true)
}

BufferQueue不是一般android系统那个BufferQueue,他是SurfaceFlinger模块专用的一个数据结构,包含了一个looper,一个handler。looper中的mMessageEnvelopes这个容器才是真正存储消息的地方

SurfaceFlinger::SurfaceFlinger(mEventQueue(mFactory.createMessageQueue())void MessageQueue::init(const sp<SurfaceFlinger>& flinger) { 
mFlinger = flinger;mLooper = new Looper(true);mHandler = new Handler(*this); 
}

BufferQueue是在SurfaceFlinger构造函数创建的用于SurfaceFlinger和HWC之间跨进程通讯SurfaceFlinger是生产者,HWC是消费者,其中数据是gpu合成好之后的GraphicBuffer

SurfaceFlinger生产message方式如下所示:

status_t SurfaceFlinger::enableVSyncInjections(bool enable) {
      schedule([=] {}).wait();
return NO_ERROR;
}
SurfaceFlinger 主线程其它所有任务被抛入到messagequeue 在SurfaceFlinger主线程执行,调用公共方法SurfaceFlinger::schedule(mEventQueue->postMessage(std::move(task)));
例如:app有图像请求渲染
queuebuffer-->consumer.onFrameAvailable-->SurfaceFlinger::signalLayerUpdate()->invalidate()
MessageQueue::invalidate() {
// 唤醒EventThread线程去loop是否有Vsync来了,Vsync时候才真正调用dispatchInvalidate
EventThread::requestNextVsync -> mCondition.notify_all() 
}
http://www.lryc.cn/news/518149.html

相关文章:

  • component-动态控制 div width 的值 根据传入的变量决定width的值 vue
  • C#中的常用集合
  • 插入实体自增主键太长,mybatis-plaus自增主键
  • 晨辉面试抽签和评分管理系统之一:考生信息管理和编排
  • 【MySQL】MVCC详解, 图文并茂简单易懂
  • 中国数字化发展的问题与机会
  • 【ROS2】☆ launch之Python
  • 如何稳定使用 O1 / O1 Pro,让“降智”现象不再困扰?
  • zookeeper监听机制(Watcher机制)
  • docker 启动 nacos 单机模式
  • 学习threejs,导入babylon格式的模型
  • 03.MPLS静态LSP配置实验
  • 程序血缘分析技术在工商银行软件工程中的应用
  • 计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask 大
  • macOS 使用 FreeRDP 远程访问 Windows:完整指南20250109
  • Java agent
  • Web无障碍
  • 概率基本概念 --- 离散型随机变量实例
  • 毕业项目推荐:基于yolov8/yolov5/yolo11的动物检测识别系统(python+卷积神经网络)
  • 基于 WEB 开发的高校学籍管理系统设计与实现
  • 阿里云发现后门webshell,怎么处理,怎么解决?
  • HTB:Bank[WriteUP]
  • 如何用数字万用表测量是否漏电?
  • 黑马跟学.苍穹外卖.Day04
  • uniapp使用scss mixin抽离css常用的公共样式
  • 用Python解决“A. Accounting”问题:完整教程与代码实现
  • FreeU: Free Lunch in Diffusion U-Net 笔记
  • 腾讯云AI代码助手编程挑战赛-古诗词学习
  • 链式二叉树,递归的暴力美学
  • 计算机网络之---数据传输与比特流