简单描述下三者间的关系:
1、Surface和Canvas:
Canvas为在画布的意思。Android的APP作图几乎都通过Canvas实例来完成,其实Canvas更多是各种画图接口的包装类,比如:drawPaints,drawPoints,drawRect,drawBitmap等接口函数,其调用流程如下所示:
而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;
}
}
最后
以上就是玩命蚂蚁最近收集整理的关于Surface、SurfaceFlinger和Canvas的关系的全部内容,更多相关Surface、SurfaceFlinger和Canvas内容请搜索靠谱客的其他文章。
发表评论 取消回复