android图像输出,android60显示系统(六)图像的输出过程

41528d3028836879cd698677c3999917.gifandroid60显示系统(六)图像的输出过程

Android6.0 显示系统(六) 图像的输 出过程 主要就是分析这个函数,我们先看看它的代码: [cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片 void SurfaceFlinger::handleMessageRefresh() { ATRACE_CALL(); static nsecs_t previousExpectedPresent = 0; nsecs_t expectedPresent = mPrimaryDispSputeNextRefresh(0); static bool previousFrameMissed = false; bool frameMissed = (expectedPresent == previousExpectedPresent); if (frameMissed != previousFrameMissed) { ATRACE_INT(“FrameMissed“, static_cast(frameMissed)); } previousFrameMissed = frameMissed; if (CC_UNLIKELY(mDropMissedFrames repaintEverything(); } else { preComposition(); rebuildLayerStacks(); setUpHWComposer(); doDebugFlashRegions(); doComposition(); postComposition(); } previousExpectedPresent = mPrimaryDispSputeNextRefresh(0); } 我们主要看下下面几个函数。 [cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片 preComposition(); rebuildLayerStacks(); setUpHWComposer(); doDebugFlashRegions(); doComposition(); postComposition(); 一、preComposition 函数我们先来看第一个函数 preComposition [cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片 void SurfaceFlinger::preComposition() { bool needExtraInvalidate = false; const LayerVector const size_t count = layers.size(); for (size_t i=0 ; ionPreComposition()) { needExtraInvalidate = true; } } if (needExtraInvalidate) { signalLayerUpdate(); } } 上面函数先是调用了 mDrawingState 的 layersSortedByZ 来得到上次绘图的 Layer 层列表。 并不是所有的 Layer 都会参与屏幕图像的绘制,因此 SurfaceFlinger 用 state 对象来记录参 与绘制的 Layer 对象。 记得在之前的博客,我们分析过 createLayer 函数来创建 Layer ,创建之后会调用 addClientLayer 函数。 [cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片 status_t SurfaceFlinger::createLayer( const String8 if (int32_t(w|h) layer; switch (flags break; case ISurfaceComposerClient::eFXSurfaceDim: result = createDimLayer(client, name, w, h, flags, handle, gbp, break; default: result = BAD_VALUE; break; } if (result != NO_ERROR) { return result; } result = addClientLayer(client, *handle, *gbp, layer); if (result != NO_ERROR) { return result; } setTransactionFlags(eTransactionNeeded); return result; } 我们来看下 addClientLayer 函数,这里会把 Layer 对象放在 mCurrentState 的 layersSortedByZ 对象中。而 mDrawingState 和 mCurrentState 什么关系呢?在后面我们会介 绍,mDrawingState 代表上一次绘图时的状态,处理完之后会把 mCurrentState 赋给 mDrawingState。 [cpp] view plain copy 在 CODE 上查看代码片派生到我的代码片 status_t SurfaceFlinger::addClientLayer(const sp if (mCurrentState.layersSortedByZ.size() >= MAX_LAYERS) { return NO_MEMORY; } mCurrentState.layersSortedByZ.add(lbc); mGraphicBufferProducerList.add(IInterface::asBinder(gbc)); } // attach this layer to the client

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值