Surfaceflinger中图像绘制流程

App产生图像数据是由Surfaceflinger消费的,下面走一下图像的消费过程。
activity中的surface对应到服务端就是layer,从layer创建过程开始


1.创建过程
SurfaceFlinger.cpp
SurfaceFlinger.createLayer() {
     //普通类型的layer,支持多个类型
      SurfaceFlinger.createNormalLayer()
}

SurfaceFlinger::createNormalLayer(){
    //创建跟app对应的layer, app的surface中主要就是操作 (*outLayer)->getBufferQueue()了
    *outLayer = new Layer(this, client, name, w, h, flags);
    status_t err = (*outLayer)->setBuffers(w, h, format, flags);
    *handle = (*outLayer)->getHandle();
   //app端就是用的这个BufferQueue
     *gbp = (*outLayer)->getBufferQueue();
}

layer.cpp
当new Layer()后第一次sp<>,会调用onFirstRef()
void Layer::onFirstRef() {
    //创建了bufferqueue   
    //class SurfaceTextureLayer : public BufferQueue   继承了BufferQueue

    mBufferQueue = new SurfaceTextureLayer(mFlinger);

   //BufferQueue的消费者,mTextureName:是纹理id
    mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(mBufferQueue, mTextureName);
    //自己监听了是否数据构造好了
    mSurfaceFlingerConsumer->setFrameAvailableListener(this);
   }

SurfaceFlingerConsumer.cpp
 class SurfaceFlingerConsumer : public GLConsumer
    //构造函数 把参数传递给基类
    //TEXTURE_EXTERNAL = GL_TEXTURE_EXTERNAL_OES  特定类型的纹理
    SurfaceFlingerConsumer(const sp<BufferQueue>& bq, uint32_t tex)
        : GLConsumer(bq, tex, GLConsumer::TEXTURE_EXTERNAL, false)
    {}

GLConsumer.cpp
    class GLConsumer : public ConsumerBase {
    //看名称就是用opengl了,保存了纹理名称,BufferQueue又给了基类
   // mTexName 绘制的纹理,app端的图像
    GLConsumer::GLConsumer(const sp<IGraphicBufferConsumer>& bq, uint32_t tex,
        uint32_t texTarget, bool useFenceSync, bool isControlledByApp) :
        ConsumerBase(bq, isControlledByApp), mTexName(tex),

Consumernase.cpp
    class ConsumerBase : public virtual RefBase,
        protected ConsumerListener

   ConsumerBase::ConsumerBase(const sp<IGraphicBufferConsumer>& bufferQue
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SurfaceFlinger是Android系统的一个重要组件,它在显示流程扮演着核心的角色。它负责管理和合成应用程序界面,将其渲染到设备的屏幕上。下面是SurfaceFlinger在显示流程的位置和作用的概述: 1. 位置:SurfaceFlinger位于Android系统的图形子系统,作为系统级服务运行。它直接与底层图形驱动程序交互,并与应用程序、系统服务和硬件之间进行协调。 2. 显示合成:SurfaceFlinger负责管理设备上的多个Surface(包括应用程序窗口和系统界面元素),并将它们合成到最终的图像。它会对这些Surface进行排序、裁剪、混合和变换,以生成最终的显示图像。 3. 双缓冲机制:SurfaceFlinger使用双缓冲机制来实现流畅的显示效果。它有一个前台缓冲区和一个后台缓冲区,前台缓冲区用于显示当前帧,后台缓冲区则用于应用程序和系统更新下一帧的内容。当后台缓冲区准备好后,SurfaceFlinger会将其切换到前台,实现无缝的显示切换。 4. 硬件加速:SurfaceFlinger充分利用硬件加速功能,通过与图形驱动交互,将图形操作委托给GPU进行处理。这样可以提高图像渲染的性能和效率,提供更流畅的用户界面。 5. 显示管理:SurfaceFlinger还负责处理显示设备的配置变化,例如屏幕旋转和分辨率调整。它会相应地调整Surface的位置和尺寸,并通知相关应用程序和系统服务进行适应性调整。 总结来说,SurfaceFlinger在Android系统的显示流程扮演着核心角色。它负责管理和合成应用程序界面,并通过双缓冲机制、硬件加速和显示管理等功能,实现流畅的图像渲染和用户界面显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值