大家好,最近我刚开始看Android操作系统比较GUI系统底层一点的实现,有一点不是太明白。
我一直搞不懂Overlay和Surface的关系,Surface是主要负责显示部分,而Overlay负责视频输出部分。
但是又看到说Overlay和Framebuffer是对现实设备的抽象,是更底层的东西。但是Overlay是在SurfaceFlinger中实现的
真的是好乱啊!!!哪位能帮我解释一下它们的关系,或者推荐点资料?万分感谢!!

解决方案 »

  1.   

    overlay 一般用在 camera取景, 视频播放等需要高帧率的地方, 还有可能 UI 界面设计的需求,如 map 地图查看软件需两层显示信息. overlay需要硬件与驱动的支持.Overlay 没有 java 层的 code, 也就没有 JNI 调用. 一般都在 native 中使用.Android中View及其子类(如TextView, Button)要画在surface上。每个surface创建一个Canvas对象(但属性时常改变),用来管理view在surface上的绘图操作,如画点画线。每个canvas对象对应一个bitmap,存储画在surface上的内容。canvas 用于开发2D图形, Surface 代表一个可供图形系统绘制的surface。可在其上绘制2D活3D图形。
      

  2.   

    谢谢解答。我理解的是Surface是负责整个显示系统,而Overlay是属于Surface系统的,并且专门负责视频输出这部分的模块。这样对吗?
      

  3.   

    framebuffer是最后整个系统用来显示用的东西。一共有两个,front和back,一个在前台显示,一个在后台绘制。之后再交换。   每个surface自己还会根据layer类型创建一个buffer。surfaceFlinger负责将这么多surface进行管理,计算每个surface哪些部分应该显示,哪些隐藏,之后循环调用layer->draw进行绘制,绘制的时候其实是先根据(可能是坐标,没细看)找出它在framebuffer中的偏移量,然后从偏移量开始改变framebuffer里面存的值,全部绘制完成之后,把backbuffer放到前台,front换到后台进行下一次绘制。
      

  4.   

    我们平时用的view,大部分最后都是调用canvas来绘制东西的,这个用的是skia,谷歌自己的2D图形库,由我们来主动控制。
    对于Camera,video等,这样就太麻烦了,所以有一种layer叫做layerbuffer。注册一个buffer,把它交给别人来填充内容,不用我们自己调用Canvas了,比如CameraService里面,registeBuffer, 一般好像是YUV格式。
    对于一些大屏的设备,这样软件pushbuffer还是很慢。所有有了overlay这个东西,直接从硬件修改buffer内存的值,速度相当快。这个需要硬件支持。这里Overlay好像只是注册了一下,绘制的时候并没有被surfaceFlinger统一管理,挺奇怪的,我还没看明白,出了一些BUG,比如浮在它上面的界面都回变得透明,视频跳屏等,很纠结
      

  5.   

    看来是overlay比surface更底层,直接与硬件打交道的东西,速度更快。
      

  6.   

    overly是可以直接通过硬件,把图像显示在屏幕上的,
    你可以理解为不需要composeSurfaces的一个特殊surface
      

  7.   

    overlay需要硬件支持.是不是指GPU和VPU呢