Android 中的 framebuffer 和SurFace的关系(GUI更新过程)
来源:互联网 发布:手机淘宝分享宝贝链接 编辑:程序博客网 时间:2024/06/04 15:12
- ViewRoot
在private void draw(boolean fullRedrawNeeded)中,会调用lockCanvas,从而获取一个Canvas对象,然后调用递归调用子窗口(View)的draw函数去绘制自己,最后调用unlockCanvasAndPost让Surface把自己更新到屏幕上。
canvas = surface.lockCanvas(dirty);mView.draw(canvas);surface.unlockCanvasAndPost(canvas);
- android/view/Surface
它主要对一些native函数的包装。
private native Canvas lockCanvasNative(Rect dirty); public native void unlockCanvasAndPost(Canvas canvas);
- android_view_Surface.cpp
这是native函数的实现。
Surface_lockCanvas它先锁住Surface,从而获取Surface相关的信息,如果格式、宽度、高度和像素缓冲区。然后创建一个bitmap,这个bitmap和View共享一个像素缓冲区,这样View就能直接把自己绘制到Surface上了。
status_t err = surface->lock(&info, &dirtyRegion);bitmap.setPixels(info.bits);nativeCanvas->setBitmapDevice(bitmap);
Surface_unlockCanvasAndPost它断开SkCanvas与Surface之间的关系,然后调用Surface的unlockAndPost。
nativeCanvas->setBitmapDevice(SkBitmap());status_t err = surface->unlockAndPost();
- surfaceflinger_client/Surface.cpp
Surface::lock调用dequeueBuffer获取一个可用的Buffer,dequeueBuffer会调用SharedBufferClient::dequeue等到backbuffer可用,然后锁住这个Buffer并填充相关信息。
status_t err = dequeueBuffer(&backBuffer);err = lockBuffer(backBuffer.get());
Surface::unlockAndPost先unlock Buffer,然后调queueBuffer显示Buffer。
status_t err = mLockedBuffer->unlock();err = queueBuffer(mLockedBuffer.get());
Surface::queueBuffer是比较有意思的,它设置更新的区域,然后通知服务端(SurfaceFlinger)。
mSharedBufferClient->setDirtyRegion(bufIdx, mDirtyRegion);err = mSharedBufferClient->queue(bufIdx);client->signalServer();
通过binder发送请求给服务:
virtual void signal() const { Parcel data, reply; data.writeInterfaceToken(ISurfaceComposer::getInterfaceDescriptor()); remote()->transact(BnSurfaceComposer::SIGNAL, data, &reply, IBinder::FLAG_ONEWAY); }
- SurfaceFlinger
BnSurfaceComposer::onTransact case SIGNAL: { CHECK_INTERFACE(ISurfaceComposer, data, reply); signal(); } break;
这是SurfaceFlinger中处理SIGNAL的代码,它调用SurfaceFlinger::signal,再调用 SurfaceFlinger::signalEvent,最后调用MessageQueue::invalidate唤醒是 SurfaceFlinger的主循环。
在主循环中waitForEvent返回,再handleRepaint去合成个Layer/Surface。
bool SurfaceFlinger::threadLoop(){ waitForEvent(); handleRepaint(); postFramebuffer();}
SurfaceFlinger::handleRepaint会调用composeSurfaces把需要绘制各个Surface合并起来,绘制到FrameBuffer的BackBuffer上。
for (size_t i=0 ; i<count ; ++i) { const sp<LayerBase>& layer = layers[i]; const Region& visibleRegion(layer->visibleRegionScreen); if (!visibleRegion.isEmpty()) { /* broncho cy add */#ifdef USEOVERLAY mToppest[1] = mToppest[0]; mToppest[0] = layer->getIdentity();#endif /* broncho end */ const Region clip(dirty.intersect(visibleRegion)); if (!clip.isEmpty()) { layer->draw(clip); } } }
SurfaceFlinger::postFramebuffer最后把FrameBuffer的BackBuffer显示到屏幕上:
hw.flip(mInvalidRegion); -->eglSwapBuffers(dpy, surface);
- Android 中的 framebuffer 和SurFace的关系(GUI更新过程)
- Android GUI 的更新过程
- Android GUI 的更新过程
- Android 中的 framebuffer 和SurFaceFlinger的关系
- Android 中的 framebuffer 和SurFaceFlinger的关系
- Android 中的framebuffer和SurFaceFlinger的关系
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android中的Surface和SurfaceView
- Android中的Surface和SurfaceView
- Android学习之Surface一,application与surface的关系
- Android中surface,surfaceview,sufaceholder以及surface客户端的关系
- 使用rapidxml解析xml
- java -version时出现could not open D:/java/jre1.6.0_22/lib/i386/jvm.cfg
- 理解 LINUX 的处理器负载均值
- 体验泛型(JDK1.5新特性)
- joomla
- Android 中的 framebuffer 和SurFace的关系(GUI更新过程)
- t3
- 从零实现3D图像引擎:(7)矩阵函数库
- 在Excel2007中快速删除重复记录的方法
- Flex中缓存问题
- Symbian 函数或类与头文件和LIB库对照表
- hdu1698(线段树)
- Java 网络编程 之 传输对象 Serialization 序列化
- Java环境配置与设置JAVA_HOME,CLASSPATH,PATH的目的