一、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系统可以实现流畅的界面渲染和动画效果,并提供给用户良好的交互体验。