Android Framework学习笔记 -- Surface的绘制过程
来源:互联网 发布:bi 数据统计是什么 编辑:程序博客网 时间:2024/06/11 01:40
今天看到一篇很不错的的关于SurfaceFlinger的文章,主要是看到android源码中有一个简单明了的test,而且还被我编译过了,都不知道的前几个星期看的都是些什么东西- -
http://blog.csdn.net/jinzhuojun/article/details/17427491
还是从test开始看起吧
test的在工程中的位置:frameworks/native/services/surfaceflinger/tests/resize,用于在屏幕上显示一块色块
int main(int argc, char** argv){ // set up the thread-pool sp<ProcessState> proc(ProcessState::self()); ProcessState::self()->startThreadPool(); // 连接到surfaceflinger sp<SurfaceComposerClient> client = new SurfaceComposerClient(); // 创建surface sp<SurfaceControl> surfaceControl = client->createSurface(String8("resize"),600, 800, PIXEL_FORMAT_RGB_565, 0); sp<Surface> surface = surfaceControl->getSurface(); // 设置Layer的z轴 SurfaceComposerClient::openGlobalTransaction(); surfaceControl->setLayer(100000); SurfaceComposerClient::closeGlobalTransaction(); // 操纵Buffer中内容 ANativeWindow_Buffer outBuffer; surface->lock(&outBuffer, NULL); ssize_t bpr = outBuffer.stride * bytesPerPixel(outBuffer.format); android_memset16((uint16_t*)outBuffer.bits, 0xffff, bpr*outBuffer.height); surface->unlockAndPost(); IPCThreadState::self()->joinThreadPool(); return 0;}
连接到surfaceflinger
补充一点,ComposerSerivce创建时会调用getSerivce函数,然后再调用defaultServiceManager获取ServiceManager接口IServiceManager,再通过IServiceManager的getService获取到SurfaceFlinger服务的接口,ISurfaceComposer其实就是SurfaceFlinger的代理接口。
创建surface
补充:Layer继承至SurfaceFlingerConsumer::ContentsChangedListener,实现了Listener的几个处理函数
- onFrameAvailable(const BufferItem& item)
- onFrameReplaced(const BufferItem& item)
- onSidebandStreamChanged()
设置Layer的z轴
使用openGlobaleTransaction可以将几个事务合并成一个提交,而且是必须的:
All composer parameters must be changed within a transaction
several surfaces can be updated in one transaction, all changes are
committed at once when the transaction is closed.
closeGlobalTransaction() requires an IPC with the server.
setLayer调用了SurfaceComposer的setLayer,与SurfaceFlinger的连接有点问题
操纵Buffer中的内容
其中BufferQueueProducer在queuebuffer中调用了BufferQueueCore的frameAvailableListener的onFrameAvailable方法,经过了一长串的调用最终会调用到Layer的onFrameAvailable。
下面是分析:
类图: 看了半天的surface post后消息的传递,重重的继承,各种set,(╯-_-)╯╧╧
先写个大概流程,免得待会忘了
首先是consumer的创建 在Layer::onFirstRef()
sp<IGraphicBufferConsumer> consumer;BufferQueue::createBufferQueue(&producer, &consumer);
listener的创建 没错,mSurfaceFlingerConsumer就是个listener
mSurfaceFlingerConsumer = new SurfaceFlingerConsumer(consumer, mTextureName);
SuffaceFlingerComsumer的构造函数 call call call到了… ConsumerBase::ConsumerBase proxy是ConsumerBase自身的代理
status_t err = mConsumer->consumerConnect(proxy, controlledByApp);
Bp端的调用,Bn端的实现 在BufferQueueConsumer::consumerConnect,在这里做了个转发,而且还在h文件里,搞得cpp文件都没有consumerConnect,我&*&^%!(@
virtual status_t consumerConnect(const sp<IConsumerListener>& consumer,bool controlledByApp) { return connect(consumer, controlledByApp);}
connect的实现
mCore->mConsumerListener = consumerListener;
也就是说
consumerListener == ConsumerBase == SuffaceFlingerComsumer
而下面又有
mSurfaceFlingerConsumer->setContentsChangedListener(this);
相当于
mCore->mConsumerListener == layer
所以queue的时候
listener.xxx == layer.onXXX;
从这以后,渲染工作就交给了SurfaceFlinger服务了
- Android Framework学习笔记 -- Surface的绘制过程
- Android Framework学习笔记 -- Surface的绘制过程
- 【学习笔记】关于Android的Surface系统
- Android全屏绘制 Surface的使用
- android View的绘制过程学习
- Android学习之Surface一,application与surface的关系
- Android学习笔记之-自定义View实例及View的绘制过程(一)
- Android学习笔记之编译系统(六)framework的编译过程
- Android Framework学习笔记 -- aidl的使用
- Android View绘制过程,基于Framework源码解析
- android framework surface native 层渲染
- Android学习之 在surface上显示YUV 笔记
- Android学习之 在surface上显示YUV 笔记
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
- Android应用程序请求SurfaceFlinger服务渲染Surface的过程分析
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- Android应用程序请求SurfaceFlinger服务创建Surface的过程分析
- RS485和RS232在实际应用中的优缺点
- 单片机的第一个程序(硬件部分)
- x86/x64 Call Jmp 指令区别
- 点到平面的距离计算
- seureCRT 快捷键、常用技巧以及 解决不能删除字符问题
- Android Framework学习笔记 -- Surface的绘制过程
- REST 和 SOAP、RPC 有什么区别?
- TCP中的NO_DELAY
- 我与《深入浅出嵌入式底层软件开发》
- 插入排序
- Android Framework学习笔记 -- Binder原理
- 如何用c#读取word中的某一段文字
- POJ-2236-Wireless Network 和 HDU-1213-How Many Tables
- 线上系统性问题定位与方法论