很多人讲lockcanvas,没有讲清楚到底是怎么回事。

问题1:lockcanvas出来的canvas到底是什么东西? 里面的位图到底是什么?

问题2:整个android系统到底有多少个Buffer?android的多个进程又是通过什么方式来共享buffer的。

先讲一个静态基本概念:

ISurfaceTexture 是一个很关键的概念,建立了客户端Buffer与服务端的连接通道。

在ISurfaceTexture.h文件中可以看到另外一个本地接口BnSurfaceTexture,这个是作为服务器端的接口而存在的。

最重要的是如下几个接口。

    virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) = 0;
virtual status_t dequeueBuffer(int *slot, uint32_t w, uint32_t h,
uint32_t format, uint32_t usage) = 0;
virtual status_t queueBuffer(int slot, int64_t timestamp,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0;
virtual void cancelBuffer(int slot) = 0;

这个四个接口android的帧缓冲的管理方式的关键所在。

Surface_lockCanvas 是个很关键的方法。在android_view_Surface.cpp中:

按照本人的分析风格,只看关键部分。其余全删除。

static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect)
{
  status_t err = surface->lock(&info, &dirtyRegion);
SkCanvas* nativeCanvas = (SkCanvas*)env->GetIntField(canvas, no.native_canvas);
SkBitmap bitmap;
bitmap.setPixels(info.bits);
nativeCanvas->setBitmapDevice(bitmap);  return canvas;}

非常简单的几句代码,就得到了一个canvas。canvas中的bitmap是从info得到的Pixels。

所以看到这里。就必须去看这一句。

status_t err = surface->lock(&info, &dirtyRegion);

在目录 frameworks/base/libs/gui/Surface.cpp中,有这么几行:

按照本人的分析风格,只看关键部分。其余全删除。

status_t Surface::lock(SurfaceInfo* other, Region* inOutDirtyRegion) {
status_t err = SurfaceTextureClient::lock(&outBuffer, inOutDirtyBounds);
}

这几行代码再简单不过了,只是继续lock而已,一次转发。

在目录 frameworks/base/libs/gui/SurfaceTextureClient.cpp中,有这么几行

按照本人的分析风格,只看关键部分。其余全删除。这段代码重要的不是lockBuffer,lockBuffer的附加效果才是最重要的,也就是dequeueBuffer。

status_t SurfaceTextureClient::lock(
ANativeWindow_Buffer* outBuffer, ARect* inOutDirtyBounds)
{
int err = SurfaceTextureClient::connect(NATIVE_WINDOW_API_CPU);
ANativeWindowBuffer* out;
status_t err = dequeueBuffer(&out);
sp<GraphicBuffer> backBuffer(GraphicBuffer::getSelf(out));
err = lockBuffer(backBuffer.get());                      
const sp<GraphicBuffer>& frontBuffer(mPostedBuffer);
copyBlt(backBuffer, frontBuffer, copyback);
void* vaddr;
status_t res = backBuffer->lock(
GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
newDirtyRegion.bounds(), &vaddr);
mLockedBuffer = backBuffer;
outBuffer->width  = backBuffer->width;
outBuffer->height = backBuffer->height;
outBuffer->stride = backBuffer->stride;
outBuffer->format = backBuffer->format;
outBuffer->bits   = vaddr;
}
}
return err;
}

上面代码中的lockBuffer一看就猜个大概就是锁住一个临界区域。

int SurfaceTextureClient::lockBuffer(android_native_buffer_t* buffer) {
LOGV("SurfaceTextureClient::lockBuffer");
Mutex::Autolock lock(mMutex);
return OK;
}

文件在frameworks/base/include/gui/ISurfaceTexture.h,有几个成员函数:

   virtual status_t requestBuffer(int slot, sp<GraphicBuffer>* buf) = 0;
virtual status_t dequeueBuffer(int *slot, uint32_t w, uint32_t h,
uint32_t format, uint32_t usage) = 0;
virtual status_t queueBuffer(int slot, int64_t timestamp,
uint32_t* outWidth, uint32_t* outHeight, uint32_t* outTransform) = 0;
virtual void cancelBuffer(int slot) = 0;

这仅仅是一些客户端的接口,最终通过

class BnSurfaceTexture : public BnInterface<ISurfaceTexture>
{
public:
virtual status_t    onTransact( uint32_t code,
const Parcel& data,
Parcel* reply,
uint32_t flags = 0);
};

的子类 SurfaceTexture,文件在 目录 frameworks/base/libs/gui/SurfaceTexture.cpp

和frameworks/base/include/gui/SurfaceTexture.h

总结一下对buffer的学习体会相关推荐

  1. c#学习体会:使用 ref 和 out 传递数组

    c#学习体会:使用 ref 和 out 传递数组(downmoon),希望与大家分享1.与 所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值. 例如: ...

  2. 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...

    小学信息技术学习体会 大家都对小学信息技术学习体会特别关注,东城教研特别为大家整理了一些有关小学信息技术学习体会的内容,其中,培养学生的创新意识和创造能力.下面就结合我的教学实践,谈谈我的几点体会.一 ...

  3. 近期爬虫学习体会以及爬豆瓣Top250源码实战

    近期爬虫学习体会以及爬豆瓣Top250源码实战 我是在B站https://www.bilibili.com/video/BV12E411A7ZQ?p=25里学习的,至今已经可以手写爬豆瓣Top250代 ...

  4. Office计算机心得,OFFICE心得学习体会.ppt

    OFFICE心得学习体会.ppt 会专61001 唐林 21 会专61001 唐林 21 会专61001 唐林 21 记在大一结束前 * 会专61001 唐林 21 * 我学word 我学习计算机,就 ...

  5. JavaOOP(面向对象)学习体会

    JavaOOP(面向对象)学习体会 类和对象的概念 类:具体相同特征和行为的事物的抽象 对象:万事万物皆对象 类是对象的类型! 对象是类的实例 ! 封装 //特征---->属性(特性)Strin ...

  6. 决策树总结(个人学习体会)

    决策树总结(个人学习体会) 算法定义 决策树:是一种监督学习(Supervised Learning)方法,通过不断对某个属性进行判断得到一个分支最终形成决策树,这个决策树能够对新的数据进行正确的分类 ...

  7. 操作系统学习体会之进程管理篇

    计算机基础知识的学习中,操作系统则是重中之重.继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习 ...

  8. 【学习体会】Lighttools8.4.0:设置虚拟相机+仿真结果3D显示

    *关于Lighttools8.4.0软件的安装教程,详见我的另一篇博文:[软件安装]win10下Lighttools8.4.0(64)光学系统建模软件的安装教程 *关于Lighttools8.4.0软 ...

  9. YouTube 架构学习体会

    YouTube 架构学习体会 来源:http://www.oschina.net/question/12_32459 这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发.高容错 ...

最新文章

  1. 【Dlib】在GPU环境中运行dlib中的例子dnn_mmod_ex报错...dlib::cuda_error...Error while calling cudaMalloc...
  2. 初学者怎样看懂python代码_新手入门必看,最常用的Python代码片段
  3. MVC5 模型 生成EF
  4. OpenCV:在imshow() 之前使用namedWindow() 的必要性讨论?
  5. 【NOIp2002】矩形覆盖
  6. Android Notification通知详解
  7. -bash: xxxx.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
  8. JavaScript获取文本框光标的像素位置(转载)
  9. 128.3. Example 配置实例
  10. creator找不到编译器 qt_Qt与Web混合开发(一)--简单使用
  11. MFC中onmouseover与onmousemove的区别
  12. 深入Linux文件系统
  13. python二维图自动保存_Autodesk Inventor工程图自动保存PDF文件iLogic代码
  14. 全面理解ADMM算法
  15. WAP PUSH介绍
  16. 使用composer安装laravel
  17. 手机变为电脑的摄像头,使像素高清起来-使用DroidCam
  18. R查看和更改工作路径的命令
  19. 2021年茶艺师(中级)考试及茶艺师(中级)复审模拟考试
  20. android flv视频播放器代码,音视频学习代码合集

热门文章

  1. 计算机工程 文章没有创新,【计算机基础论文】小议计算机专业人才创新力的培育(共1911字)...
  2. html文章整体居中,div居中与div内容居中
  3. 高亚芳 mysql_MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析
  4. string 日期比较_java8-新的日期API
  5. 曲线拟合最小二乘法C实现
  6. 直线拟合的实现步骤和相关算子
  7. LOJ#2302 整数
  8. android.support-v7版本依赖配置
  9. python学习--DAY2
  10. Mesos:一个开源的分布式弹性资源管理系统