Surface、SurfaceFlinger和Canvas的关系

简单描述下三者间的关系:

1、Surface和Canvas:

       Canvas为在画布的意思。Android的APP作图几乎都通过Canvas实例来完成,其实Canvas更多是各种画图接口的包装类,比如:drawPaints,drawPoints,drawRect,drawBitmap等接口函数,其调用流程如下所示:

Surface、SurfaceFlinger和Canvas的关系_第1张图片

而Surface简单的说,对应了一块屏幕缓冲区,每个window对应一个Surface,任何View都要画在Surface的Canvas上。传统的view共享一块屏幕缓冲区,所有的绘制必须在UI线程中进行。

2 、SurfaceFlinger和Surface:

SurfaceFlinger英文直译就是surface的投递者,surface就不用翻译了,翻译了反而不好理解。SurfaceFlinger是android的一个服务进程,其负责管理应用端的surface,将所有的surface复合。 首先要明确的是SurfaceFlinger只是负责合并 Surface的控制,比如说计算出两个Surface重叠的区域,至于Surface需要显示的内容,则通过skia,opengl和 pixflinger来计算他是介于图形库和应用之间的一层。每个应用在它自己的surface完成各种图形操作后,请求SurfaceFlinger显示到屏幕,surfaceflinger就会将所有的surface叠加起来,并且反映到framebuffer。

SuffaceFlinger和Surface和Canvas的应用实例就是RootViewImpl的drawSoftware中的mSurface.lockCanvas函数既建立了SurfaceFlinger连接。

public Canvas lockCanvas(Rect inOutDirty)

            throwsSurface.OutOfResourcesException, IllegalArgumentException {

        synchronized (mLock) {

           checkNotReleasedLocked();

            if (mLockedObject != 0) {

                throw new IllegalStateException("Surface wasalready locked");

            }

            mLockedObject = nativeLockCanvas(mNativeObject, mCanvas, inOutDirty);

            return mCanvas;

        }

    }


你可能感兴趣的:(android)