Android图形显示CompositionEngine详解

284 阅读4分钟

一、CompositionEngine介绍

SurfaceFlinger是Android系统中的一个重要组件,它负责管理和渲染所有的图形界面。CompositionEngine是SurfaceFlinger中的一个子模块,它负责处理图层的合成和渲染。

CompositionEngine的主要功能包括:

  • 图层合成:CompositionEngine通过将多个图层按照一定的规则进行合成,生成最终的显示帧。这些图层可以是应用程序的窗口、系统UI元素、动画效果等。

  • 硬件加速:CompositionEngine利用硬件加速功能,如GPU,来提高图层的渲染性能和效果。

  • 显示管理:CompositionEngine负责管理显示设备的配置信息,如分辨率、刷新率等,并根据这些信息进行图层的适配和渲染。

  • 动画效果:CompositionEngine支持各种动画效果,如平移、缩放、淡入淡出等,以提升用户界面的交互体验。

通过SurfaceFlinger和CompositionEngine的协同工作,Android系统可以实现流畅的界面渲染和动画效果,并提供给用户良好的交互体验。

二、CompositionEngine相关类

CompositionEngine介绍

Android中CompositionEngine是Android系统中的一个关键组件,它负责处理图形渲染和显示的工作。它的主要功能是将应用程序的UI元素(如视图、图形、动画等)合成到屏幕上,以实现流畅的用户界面体验

CompositionEngine使用了硬件加速技术,通过利用GPU来加速图形渲染和合成操作。它采用了基于场景图(Scene Graph)的方式来管理UI元素,并通过多个图层(Layer)来组织和渲染这些元素。每个图层都可以包含一个或多个UI元素,并且可以应用不同的变换、透明度和混合模式等效果。

CompositionEngine还支持动画效果的处理,它可以根据动画的属性变化来更新图层的状态,并在每一帧中重新合成和渲染UI元素,以实现平滑的动画效果。

此外,CompositionEngine还提供了一些高级功能,如遮罩(Masking)、裁剪(Clipping)和深度测试(Depth Testing)等,以支持更复杂的UI效果和交互。

CompositionEngine代码位于: frameworks/native/services/surfaceflinger/CompositionEngine/src/CompositionEngine.cpp native\services\surfaceflinger\CompositionEngine\include\compositionengine\impl\CompositionEngine.h

  • CompositionEngine的定义 CompositionEngine继承了compositionengine::CompositionEngine。

主要接口:

1)根据输入显示参数创建显示对象

std::shared_ptr<compositionengine::Display> createDisplay(
            const compositionengine::DisplayCreationArgs&) override;

2)设置和获取HwComposer对象

HWComposer& getHwComposer() const override;
void setHwComposer(std::unique_ptr<HWComposer>) override;           
renderengine::RenderEngine& getRenderEngine() const override;

3)

void present(CompositionRefreshArgs&) override;
void updateCursorAsync(CompositionRefreshArgs&) override;
void preComposition(CompositionRefreshArgs&) override;

CompositionEngine中重要定义

OutputLayer 输出层包含图层的输出相关合成状态。

OutputLayer 的定义:

class OutputLayer {}
class OutputLayer : public virtual compositionengine::OutputLayer {}
class OutputLayer final : public BaseOutputLayer {}

RenderSurface 封装所有内容,以便使用 RenderEngine 合成渲染图面。

RenderSurface的定义:

class RenderSurface : public compositionengine::RenderSurface {
    const sp<Fence>& getClientTargetAcquireFence() const override;
    void setBufferDataspace(ui::Dataspace) override;
    void setBufferPixelFormat(ui::PixelFormat) override;
    void setDisplaySize(const ui::Size&) override;
    void setProtected(bool useProtected) override;
    status_t beginFrame(bool mustRecompose) override;
    void prepareFrame(bool usesClientComposition, bool usesDeviceComposition) override;
    std::shared_ptr<renderengine::ExternalTexture> dequeueBuffer(
            base::unique_fd* bufferFence) override;
    void queueBuffer(base::unique_fd readyFence) override;
    void onPresentDisplayCompleted() override;
    ...
}

DisplaySurface 用于使用显示图层(缓冲区队列)的抽象

DisplaySurface代码位于: frameworks/native/services/surfaceflinger/CompositionEngin/src/DisplaySurface.cpp frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/DisplaySurface.h

DisplaySurface的定义:

class ConsumerBase : public virtual RefBase,
        protected ConsumerListener {

}
class FramebufferSurface : public ConsumerBase, public compositionengine::DisplaySurface {
public:
    FramebufferSurface(HWComposer& hwc, PhysicalDisplayId displayId,
                       const sp<IGraphicBufferConsumer>& consumer, const ui::Size& size,
                       const ui::Size& maxSize);

    virtual status_t beginFrame(bool mustRecompose);
    virtual status_t prepareFrame(CompositionType compositionType);
    virtual status_t advanceFrame();
    virtual void onFrameCommitted();
    ...
}
        

Display 显示器是可以由硬件作曲家显示设备支持的合成目标。

Display代码位于: frameworks/native/services/surfaceflinger/CompositionEngin/src/Display.cpp frameworks/native/services/surfaceflinger/CompositionEngine/include/compositionengine/Display.h

Display的定义:

class Output : public virtual compositionengine::Output {}

class Display : public virtual Output {}

class Display : public compositionengine::impl::Output, public virtual compositionengine::Display {
}

Planner 这是层缓存的顶级类。它负责启发式地确定当前层堆栈的组合策略,并将非活动层平展到覆盖缓冲区中,以便可以更有效地表示层堆栈的各个部分。

3 小结

CompositionEngine是SurfaceFlinger中的一个子模块,它负责处理图层的合成和渲染。

通过SurfaceFlinger和CompositionEngine的协同工作,Android系统可以实现流畅的界面渲染和动画效果,并提供给用户良好的交互体验。