wentao

记录多一点,懂得多一点

Android 14 - 绘制体系 - 概览_blastbufferqueue-CSDN博客

从Android 12开始,Android的绘制系统有结构性变化, 在绘制的生产消费者模式中,新增BLASTBufferQueue,客户端进程自行进行queue的生产和消费,随后通过Transation提交到SurfaceFlinger,如此可以使得各进程将缓存提交到SufrfaceFlinger后合并到同一事务后同步提交,在同一帧生效。实际上,从Android12到Android14整个绘制系统在各个环节也都有了或大或小的调整,比如Android13发布了1.3版本的Vulkan, Android14新增了TextureView,等等。本文基于Android14。1

Android SurfaceFlinger-CSDN博客

一、SurfaceFlinger介绍

SurfaceFlinger是Android系统中的一个重要组件,它主要负责窗口管理与界面显示。具体来说,SurfaceFlinger作为系统的显示引擎,负责接收各应用程序发来的图像数据,并组合成一张完整的画面,并输出到显示屏上。SurfaceFlinger通过重绘整个屏幕或部分屏幕来更新UI界面。它还提供了多种硬件加速技术,如OpenGL ES、Vulkan等,使应用程序能够更快地渲染UI界面。

Android13 GraphicBuffer 创建流程-CSDN博客

GraphicBuffer用于管理图形缓存数据的类,GraphicBuffer的构造方法如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
//frameworks/native/libs/ui/GraphicBuffer.cpp
class GraphicBuffer
    : public ANativeObjectBase<ANativeWindowBuffer, GraphicBuffer, RefBase>,
      public Flattenable<GraphicBuffer>{
	GraphicBuffer::GraphicBuffer(uint32_t inWidth, uint32_t inHeight, PixelFormat inFormat,
	                             uint32_t inLayerCount, uint64_t inUsage, std::string requestorName)
	      : GraphicBuffer() {
	    mInitCheck = initWithSize(inWidth, inHeight, inFormat, inLayerCount, inUsage,
	                              std::move(requestorName));
	}
}

GraphicBuffer 的构造函数非常简单, 它只是调用了一个初始化函数 initWithSize:

Android13 Surface创建流程分析-CSDN博客

Surface是Android中用于表示一个图像缓冲区的类,Surface是在SurfaceControl创建时创建的,代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
//frameworks/native/services/surfaceflinger/Client.cpp
class Client : public BnSurfaceComposerClient
status_t Client::createSurface(const String8& name, uint32_t w, uint32_t h, PixelFormat format,
                               uint32_t flags, const sp<IBinder>& parentHandle,
                               LayerMetadata metadata, sp<IBinder>* handle,
                               sp<IGraphicBufferProducer>* gbp) {
    // We rely on createLayer to check permissions.
    return mFlinger->createLayer(name, this, w, h, format, flags, std::move(metadata), handle, gbp, parentHandle);
}
}

SurfaceFlinger createLayer

mFlinger是SurfaceFlinger,所以Client的具体实现还是依靠的SurfaceFlinger,并且注意,在应用层的Surface在SurfaceFlinger进程名叫Layer,它和应用层的Surface是一 一对应的关系,我们来看createLayer函数:

0%