总结一下对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 这几天一直在关注和学习一些大型网站的架构,希望有一天自己也能设计一个高并发.高容错 ...
最新文章
- 【Dlib】在GPU环境中运行dlib中的例子dnn_mmod_ex报错...dlib::cuda_error...Error while calling cudaMalloc...
- 初学者怎样看懂python代码_新手入门必看,最常用的Python代码片段
- MVC5 模型 生成EF
- OpenCV:在imshow() 之前使用namedWindow() 的必要性讨论?
- 【NOIp2002】矩形覆盖
- Android Notification通知详解
- -bash: xxxx.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
- JavaScript获取文本框光标的像素位置(转载)
- 128.3. Example 配置实例
- creator找不到编译器 qt_Qt与Web混合开发(一)--简单使用
- MFC中onmouseover与onmousemove的区别
- 深入Linux文件系统
- python二维图自动保存_Autodesk Inventor工程图自动保存PDF文件iLogic代码
- 全面理解ADMM算法
- WAP PUSH介绍
- 使用composer安装laravel
- 手机变为电脑的摄像头,使像素高清起来-使用DroidCam
- R查看和更改工作路径的命令
- 2021年茶艺师(中级)考试及茶艺师(中级)复审模拟考试
- android flv视频播放器代码,音视频学习代码合集
热门文章
- 计算机工程 文章没有创新,【计算机基础论文】小议计算机专业人才创新力的培育(共1911字)...
- html文章整体居中,div居中与div内容居中
- 高亚芳 mysql_MySQL · 专家投稿 · MySQL数据库SYS CPU高的可能性分析
- string 日期比较_java8-新的日期API
- 曲线拟合最小二乘法C实现
- 直线拟合的实现步骤和相关算子
- LOJ#2302 整数
- android.support-v7版本依赖配置
- python学习--DAY2
- Mesos:一个开源的分布式弹性资源管理系统