美文网首页
Android Framework学习之surface的绘制原理

Android Framework学习之surface的绘制原理

作者: 一只二凡子 | 来源:发表于2022-12-21 09:17 被阅读0次

Surface 绘制原理

surface本身不是buffer,surface跨进程传递时也没带buffer,surface绘制时是有buffer的

绘制在应用端本地完成,surface绘制完后需要提交到SurfaceFlinger,SurfaceFlinger将图像合成,最后显示

drawSoftware:如果开启了硬件加速的话,这里会调用硬件加速绘制,这里默认考虑采用软件绘制

mNativeObject:surface在native层对应的surface对象的指针

mCanvas:surface里面的一个属性,此时的mCanvas是空的(这个canvas里的SkBitmap是空的,这个SkBitmap是skia库里的一个数据结构, 这个SkBitmap是这个canvas的绘制缓冲区)

nativeLockCanvas调用完后,mCanvas就有值了

每次绘制都会重新申请buffer

surface里有两个buffer:前台buffer(mPostedBuffer)和后台buffer(mLockedBuffer),前台buffer是用来显示的,后台buffer是用来绘制的

dequeueBuffer:获得一个后台buffer

提交buffer

在surface上绘制,需要一个buffer,会在SurfaceFlinger进程里创建一个BufferQueue,BufferQueue有两端:producer端和consumer端,producer端是需要跨进程传回给应用端的,surface要绘制时,使用producer端从bufferQueue里申请一个buffer(binder调用),这个buffer作为canvas的bitmap的缓冲区。canvas绘制完时将这个buffer返回到bufferQueue,BufferQueue通知consumer端回调它的onFrameAvailable,这个回调表示一帧数据好了。这个consumer可以在SurfaceFlinger进程,也可以传给别的进程。

问题:

surface绘制的buffer是怎么来的?

通过GraphicBufferProducer向bufferQueue申请来的

2. buffer绘制完了又是怎么提交的?

        通过GraphicBufferProducer向BufferQueue提交的

相关文章

网友评论

      本文标题:Android Framework学习之surface的绘制原理

      本文链接:https://www.haomeiwen.com/subject/ulwhqdtx.html