Android Surface & Canvas简介

#.Surface

    是图形缓冲区(GraphicBuffer)的封装类,一般用作图像绘制的载体,例如用于承载View画面、承载SurfaceView画面、承载相机拍摄的图像、或者承载MediaCodec的输入/输出画面、承载ImageReader输入缓存画面等等。
     Surface都是双缓冲的,从概念上讲,可以简化理解为有两个缓冲区引用,一个frontBuffer和一个backBuffer,backBuffer指向后置缓冲区,用于缓存正在绘制的画面;而frontBuffer指向前置缓冲区,用于缓存最近绘制完毕、要提交使用的画面。  
    绘制中不断地循环这个过程:
    1.执行lockCanvas()后,获取Surface的Canvas对象,用于在backBuffer上进行绘制;
    2.在backBuffer上绘制完毕后,调用unlockCanvasAndPost(),互换二者身份,原来的backBuffer变为frontBuffer用于提交给外部使用,而原来的frontBuffer变为backBuffer去参与下一轮绘制。
    这里的“外部使用”所指代的,具体要看画面消费者是谁,例如当SurfaceFinger消费画面时,会被用于合成屏幕画面,最终输出到屏幕上;当MediaCodec编码器消费画面时,会被用于编码器编码,然后输出到编码器输出缓冲区。        
(大致过程可以这么理解,其实底层在利用BufferQueue来进行Buffer的分配和循环使用,具体细节跟上面会有一些差异,但一般情况下画面生产方速度不会快于画面消费方,BufferQueue中一般只有两个GraphicBuffer,效果的确是前后缓冲区互换索引。)
    
    

    其中第一步也可通过lockCanvas(Rect d

你可能感兴趣的:(Android音视频,android,Surface,Canvas)