总结一下对buffer的学习体会
很多人讲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的学习体会相关推荐
- c#学习体会:使用 ref 和 out 传递数组
c#学习体会:使用 ref 和 out 传递数组(downmoon),希望与大家分享1.与 所有的 out 参数一样,在使用数组类型的 out 参数前必须先为其赋值,即必须由接受方为其赋值. 例如: ...
- 小学生计算机课学生心得,【小学信息技术学习体会13篇】_小学信息技术学习体会范文大全_2021年小学信息技术学习体会_东城教研...
小学信息技术学习体会 大家都对小学信息技术学习体会特别关注,东城教研特别为大家整理了一些有关小学信息技术学习体会的内容,其中,培养学生的创新意识和创造能力.下面就结合我的教学实践,谈谈我的几点体会.一 ...
- 近期爬虫学习体会以及爬豆瓣Top250源码实战
近期爬虫学习体会以及爬豆瓣Top250源码实战 我是在B站https://www.bilibili.com/video/BV12E411A7ZQ?p=25里学习的,至今已经可以手写爬豆瓣Top250代 ...
- Office计算机心得,OFFICE心得学习体会.ppt
OFFICE心得学习体会.ppt 会专61001 唐林 21 会专61001 唐林 21 会专61001 唐林 21 记在大一结束前 * 会专61001 唐林 21 * 我学word 我学习计算机,就 ...
- JavaOOP(面向对象)学习体会
JavaOOP(面向对象)学习体会 类和对象的概念 类:具体相同特征和行为的事物的抽象 对象:万事万物皆对象 类是对象的类型! 对象是类的实例 ! 封装 //特征---->属性(特性)Strin ...
- 决策树总结(个人学习体会)
决策树总结(个人学习体会) 算法定义 决策树:是一种监督学习(Supervised Learning)方法,通过不断对某个属性进行判断得到一个分支最终形成决策树,这个决策树能够对新的数据进行正确的分类 ...
- 操作系统学习体会之进程管理篇
计算机基础知识的学习中,操作系统则是重中之重.继对微机原理和计算机组成原理的基础知识了解和学习后,对硬件和基础原理的理论有了初步的了解,结合在所在公司的项目中开发应用的经历和体会,进行了操作系统的学习 ...
- 【学习体会】Lighttools8.4.0:设置虚拟相机+仿真结果3D显示
*关于Lighttools8.4.0软件的安装教程,详见我的另一篇博文:[软件安装]win10下Lighttools8.4.0(64)光学系统建模软件的安装教程 *关于Lighttools8.4.0软 ...
- YouTube 架构学习体会
YouTube 架构学习体会 来源:http://www.oschina.net/question/12_32459 这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发.高容错 ...
最新文章
- tensorflow2.0 基础一 常用数据类型及转换
- 基于postfix一步一步构建Mailserver,支持虚拟用户,支持WebMail
- 存储Image到XML、显示Image
- 对现代软件工程开发看法
- Codeforces 723D. Lakes in Berland
- JDBC连接数据库教程,postgreSQL
- 收藏!架构师需要掌握的99条铁律
- Ubuntu下安装Rabbitmq和golang环境
- concurrentbag 删除指定元素_Python实现列表索引批量删除的5种方法_python
- Java多线程系列---“基础篇”08之 join()
- Nsight Visual Studio Edition初学使用方法
- 勒索病毒是什么?防勒索病毒我们该怎么做?
- 贪吃蛇c加加代码_c语言贪吃蛇代码
- excel白屏未响应_EXCEL2016经常卡死,白屏,经常使用过程中卡住,然后显示office正在尝试恢复...
- OneNote无法粘贴图片
- 深入linux设备驱动程序内核机制(第三章) 读书笔记
- iscc 2021wp
- 开发一个Canvas小游戏 实现一个游戏“引擎”
- 验证身份证号码是否有效
- Calendar中 DAY_OF_MONTH, DAY_OF_YEAR, DATE 的区别
热门文章
- html获取文本框的值,如何获取输入框的内容
- l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法
- Win10:你需要来自XXX的权限才能对此文件夹进行更改
- opencv中的CommandLineParser类用法
- rfc垮端口 sap_SAP扫盲系列之二:SAP ABAP应用服务器的组成部分
- 2019手机浏览器排名_浏览器排行榜2019年1月浏览器市场份额排名
- 报告称中国出境游客移动支付消费首次超现金
- 黑客可以让协作机器人成为杀手
- PostgreSQL9.5:pg_rewind 快速恢复备节点
- Linux下获取详细硬件信息的工具:Dmidecode命令详解