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

香河县做网站今天热点新闻

香河县做网站,今天热点新闻,网站设置密码怎么破解,手机网站建设经典教程前景提要: 当HWComposer接收到Vsync信号时,唤醒DisSync线程,在其中唤醒EventThread线程,调用DisplayEventReceiver的sendObjects像BitTub发送消息,由于在SurfaceFlinger的init过程中创建了EventThread线程&#xff0c…

前景提要:

HWComposer接收到Vsync信号时,唤醒DisSync线程,在其中唤醒EventThread线程,调用DisplayEventReceiver的sendObjects像BitTub发送消息,由于在SurfaceFlinger的init过程中创建了EventThread线程,并添加到MQ中进行创建Connection并监听对应的BitTube信息,因此最后会在MQ中接收到通知调用Handler的发送消息到SF的主线程中,SF的handlerMessage方法去处理该消息并执行对应的绘制流程。

SurfaceFliger绘制流程:

第一步:

回调每个图层onPreComposition方法

第一步preComposition中,获取到所有参与绘制的layer图层信息,并回调onPreComposition方法,观察是否有图层发生变化(通过方法返回值判断)

【通过判断MQueuedFrames是否大于0,代表图层发生变化,在onFrameAvailable中会对这个字段+1】

SurfaceFlinger可以控制某些Layer不参与绘制过程,比如需要将悬浮按钮图层隐藏。

如果有则向MQ中发送invalidata消息,SurfaceFliger的MQ接收到之后会调用 handleMessageTransaction()方法handleMessageInvalidate() 方法,根据是否刷新调用signalRefresh方法。

代码部分:

void SurfaceFlinger::preComposition()
{
    bool needExtraInvalidate = false;
    const LayerVector& layers(mDrawingState.layersSortedByZ);
    const size_t count = layers.size();
    for (size_t i=0 ; i<count ; i++) {
        //回调每个图层onPreComposition方法
        if (layers[i]->onPreComposition()) {
            needExtraInvalidate = true;
        }
    }
    
    //当存在图层有变化,则发送invalidate消息
    if (needExtraInvalidate) {
        signalLayerUpdate(); 
    }
}

//图层是否发生变化是通过mQueuedFrames字段确定
bool Layer::onPreComposition() {
    mRefreshPending = false;
    return mQueuedFrames > 0 || mSidebandStreamChanged;
}

当Layer可见时会调用onFrameAvailable方法,对mQueuedFrames+1

代码部分

void Layer::onFrameAvailable(const BufferItem& item) {
    { // Autolock scope
        Mutex::Autolock lock(mQueueItemLock);

        if (item.mFrameNumber == 1) {
            mLastFrameNumberReceived = 0;
        }

        while (item.mFrameNumber != mLastFrameNumberReceived + 1) {
            status_t result = mQueueItemCondition.waitRelative(mQueueItemLock,
                    ms2ns(500));
        }

        mQueueItems.push_back(item);
        android_atomic_inc(&mQueuedFrames); //加1操作

        //唤醒所有pending的回调方法
        mLastFrameNumberReceived = item.mFrameNumber;
        mQueueItemCondition.broadcast();
    }
    //和上面一样的操作通知flinger图层发生更新
    mFlinger->signalLayerUpdate(); 
}

handleMessageTransaction方法的主要工作:

  • 遍历所有Layer来执行其doTransaction方法;
  • 处理显示设备的改变;
  • 处理layers的改变;
  • 提交transaction,并更新光标情况。
doTransaction工作:

比较上次Layer的状态(宽高)和此次Layer的状态(宽高)判断Layer尺寸是否发生变化,当尺寸发生变化时调整Surface的缓冲区大小,并调用Layer的invalidate重新计算可见区域大小,并接着同步当前Layer状态,接着再更新光标情况

handleMessageInvalidate工作:

获取所有的layer,将更新的图层放入到layerWithQueuedFrames中,接着取出调用各个图层的latchBuffer处理。

rebuildLayerStacks

获取每个显示屏中的所有可见图层列表,计算每个图层的可见区域,根据Z轴的深度把所有图层添加进来

重建所有显示屏的各个可见Layer,并重新根据Z轴调整Layer图层的顺序

后续分析

setUpHWcomposer

将Layer添加到HWComposer中

doComposition

postComposition

HWComposer更新frameBuffer缓冲区(通过转换后的屏幕坐标判断是局部区域更新还是整个屏幕都需要更新),Display从缓冲区中取出数据进行显示

原文链接:SurfaceFliger绘制流程 - 掘金 (juejin.cn)

http://www.hrbkazy.com/news/52201.html

相关文章:

  • 网页设计与网站开发素材百度搜索引擎使用技巧
  • 做一个公司的门户网站多少钱百度上海分公司
  • 江苏嘉力电力建设有限公司网站怎样做百度推广
  • 整站快速排名正规手游代理平台有哪些
  • 网站统计访客数量怎么做免费创建个人网页
  • 做网站怎么加弹幕域名注册平台
  • 地产商网站建设最有效的网络推广方式和策略
  • 吉林省 网站建设搜索引擎优化seo是什么
  • 织梦大气金融类通用企业网站模板购物网站排名
  • 曲靖网站制作公司晚上国网app
  • a5做网站最新今日头条
  • 广州seo网络培训课程电商seo优化
  • 网站建设属于什么领域网销怎么做才能做好
  • 高新技术企业网站怎么做网络优化的工作内容
  • 南京网站建设 雷仁网做网络推广费用
  • 做电影网站解决版权问题宁波seo推广优化
  • 本地生活网站 源码黑帽seo是作弊手法
  • 让人做网站需要注意什么网站seo排名
  • 网站设计需要什么技术阿里云域名查询和注册
  • 网站建设软件有哪些原画培训班一般学费多少
  • 百度网页打不开无法访问怎么办网站建设公司seo关键词
  • 番禺建设网站系统百度seo如何快速排名
  • 一个免费的影视网站模板google在线代理
  • wordpress 多占点优化防疫措施
  • 安卓和网站开发找工作色盲测试图第六版
  • 网站特点怎么写网络推广服务外包
  • 域名解析网站打不开深圳将进一步优化防控措施
  • 想学服装设计去哪个大学好seo优化快速排名
  • 涂料网站建设济南百度推广开户
  • 怎么做阿里巴巴英文网站免费网站排名优化软件