Android Surface & Canvas简介

本文介绍了Android中的Surface和Canvas,重点讲解了Surface的双缓冲特性,如何通过lockCanvas(Rect dirty)来确定绘制的脏区,从而提高绘制效率,以及如何使用null参数实现整个backBuffer作为脏区的绘制策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#.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 dirty)时可以传入一个脏区,这样在lockCanvas()中会把frontBuffer中“上一轮脏区-本轮脏区”那部分画面复制到backBuffer上,而绘制时只需要绘制本轮脏区范围对应的内容,没必要全部重新绘制。如果lockCanvas(nu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值