本文档主要讲解在OpenHarmony中,硬件合成适配的方法及原理说明。
环境说明:
- OHOS版本:3.1-Release及以上
一、背景介绍
1.1 什么是合成
要理解什么是合成,合成做了什么?我们先通过分解设置界面来回答这个问题:
在设置界面中,一帧完整的图像是由4个部分构成的,每一个部分我们称之为一个layer。
layer的概念
layer(图层)是图形合成中最重要的单元,一个layer对应一个buffer及显示参数。一帧图像由一个或多个layer组成,每个layer单独负责一块区域的内容刷新,大大提升了渲染及显示效率。比如:我们把鼠标的显示单独设置成一个Layer,鼠标的移动,只需要更改layer的显示坐标,不需要重复渲染背景显示区域的数据等。
在设置界面中,4个layer分别是背景层、应用层、状态栏和工具栏。合成就是把这些layer组合在一起,最终变成一帧完整的图像。
我们可以通过如下命令获取当前界面的layers信息:
hidumper -s 10 -a surface
对当前界面截屏
snapshot_display -f /data/snapshot_display.jpeg
我们可以看到,layer2和layer3背景显示为黑色,与实际效果有较大区别。要理解这个差异的原因,我们需要要知道合成做了什么。
1.2 合成做了什么
从前面的介绍我们知道,合成就是把多个layer合成了一帧图像。那这个合成的过程中,主要处理了哪些事?总结如下:
-
颜色混合。包含透明度处理、背景填充、阴影处理等。
-
编码格式转换。支持RGB565、RGB888、ARGB888、YUV420_2P等
-
缩放处理。支持1/16~24倍率缩放
-
输入/输出旋转。
不同的硬件支持的能力有差别,最基本的能力需要支持透明度处理及编码转换。
上面layer背景显示黑色的原因,是因为背景的RGBA值都是0,RGB 值为0,显示黑色。Alpha值为0,为全透明。如果给他们添加一个背景图层,那图层就会显示成背景的颜色值。
理解了合成,我们再看看合成模块在OpenHarmony系统进程中的位置。
1.3 合成在OpenHarmony中位置
图像合成在OpenHarmony进程示意图,以便了解合成模块的生命周期及运行逻辑:
如上图所示,合成模块代码由虚框标记,运行在render_service进程中。硬件适配主要是适配display_device及display_gfx模块。
-
display_device: 为composer提供接口及适配
-
display_gfx:包含具体硬件sensor的功能实现。
重启render_service服务,Dispaly HDI服务就会重启。
1.4 合成的方式
OpenHarmony中合成方式有以下几种:
- CPU合成。由skia或pixmax提供。
- GPU合成。由GPU硬件提供。
- 纯硬件sensor合成。如展锐的gsp,瑞芯微的rga等
- drm合成。由drm通用接口封装,一般集成合成和送显功能。如展锐的dpu。
以上合成方式在相同layers数量下,xx平台性能对比如下:
类型 | CPU | GPU | GFX | DRM |
---|---|---|---|---|
合成时间(ms) |