之前写了一篇博客,分析了视频如何显示的
http://blog.csdn.net/wan8180192/article/details/50269405
以及gralloc的内存管理
http://blog.csdn.net/wan8180192/article/details/50513895
android中,多个surface layer要显示到屏幕上,就要合成到一起,合成方式有两种:
离线合成
先将所有图层画到一个最终层(FrameBuffer)上,再将FrameBuffer送到LCD显示。由于合成FrameBuffer与送LCD显示一般是异步的(线下生成FrameBuffer,需要时线上的LCD去取),因此叫离线合成。
在线合成
不使用FrameBuffer,在LCD需要显示某一行的像素时,用显示控制器将所有图层与该行相关的数据取出,合成一行像素送过去。只有一个图层时,又叫Overlay技术。
由于省去合成FrameBuffer时读图层,写FrameBuffer的步骤,大幅降低了内存传输量,减少了功耗,但这个需要硬件支持。
对于这两种方式,各有优缺点,
离线合成充分利用GPU,更加灵活,不受win layer数量限制。但是功耗大,不利于移动设备。GPU如果性能不强,复杂应用场景下会出现卡顿,实时性不好
在线合成,功耗小,没有性能瓶颈,没有时延。但是不够灵活。UI layer一旦变多,需要重新借助于GPU的离线合成。
一般来说,优先使用overlay.实在不行就用GPU
在实际代码中,可以看到SurfaceFlinger::doComposeSurfaces中, 有以下处理,
switch (cur->getCompositionType()) {
case HWC_OVERLAY: { overlay 方式,采用HWC硬件来合成
const Layer::State& state(layer->getDrawingState());
if ((cur->g