很多人讲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. tensorflow2.0 基础一 常用数据类型及转换
  2. 基于postfix一步一步构建Mailserver,支持虚拟用户,支持WebMail
  3. 存储Image到XML、显示Image
  4. 对现代软件工程开发看法
  5. Codeforces 723D. Lakes in Berland
  6. JDBC连接数据库教程,postgreSQL
  7. 收藏!架构师需要掌握的99条铁律
  8. Ubuntu下安装Rabbitmq和golang环境
  9. concurrentbag 删除指定元素_Python实现列表索引批量删除的5种方法_python
  10. Java多线程系列---“基础篇”08之 join()
  11. Nsight Visual Studio Edition初学使用方法
  12. 勒索病毒是什么?防勒索病毒我们该怎么做?
  13. 贪吃蛇c加加代码_c语言贪吃蛇代码
  14. excel白屏未响应_EXCEL2016经常卡死,白屏,经常使用过程中卡住,然后显示office正在尝试恢复...
  15. OneNote无法粘贴图片
  16. 深入linux设备驱动程序内核机制(第三章) 读书笔记
  17. iscc 2021wp
  18. 开发一个Canvas小游戏 实现一个游戏“引擎”
  19. 验证身份证号码是否有效
  20. Calendar中 DAY_OF_MONTH, DAY_OF_YEAR, DATE 的区别

热门文章

  1. html获取文本框的值,如何获取输入框的内容
  2. l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法
  3. Win10:你需要来自XXX的权限才能对此文件夹进行更改
  4. opencv中的CommandLineParser类用法
  5. rfc垮端口 sap_SAP扫盲系列之二:SAP ABAP应用服务器的组成部分
  6. 2019手机浏览器排名_浏览器排行榜2019年1月浏览器市场份额排名
  7. 报告称中国出境游客移动支付消费首次超现金
  8. 黑客可以让协作机器人成为杀手
  9. PostgreSQL9.5:pg_rewind 快速恢复备节点
  10. Linux下获取详细硬件信息的工具:Dmidecode命令详解