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提交的
网友评论