android hwcomposer 在视频播放中的应用

之前写了一篇博客,分析了视频如何显示的,http://blog.csdn.net/wan8180192/article/details/50269405以及gralloc的内存管理这里结合hwcomposer模块,以及视频播放的场景,对其中有一些细节,在这里再做补充一下 。android中,多个surface layer要显示到屏幕上,就要合成到一起,合成方式有两种:
摘要由CSDN通过智能技术生成

之前写了一篇博客,分析了视频如何显示的

http://blog.csdn.net/wan8180192/article/details/50269405

以及gralloc的内存管理

http://blog.csdn.net/wan8180192/article/details/50513895


这里结合hwcomposer模块,以及视频播放的场景,对其中有一些细节,在这里再做补充一下

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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值