Android GUI更新过程
来源:互联网 发布:中小型网络组建实训3 编辑:程序博客网 时间:2024/05/23 11:40
1.ViewRoot
在private void draw(boolean fullRedrawNeeded)中,会调用lockCanvas,从而获取一个Canvas对象,然后调用递归调用子窗口(View)的draw函数去绘制自己,最后调用unlockCanvasAndPost让Surface把自己更新到屏幕上。
canvas = surface.lockCanvas(dirty);
mView.draw(canvas);
surface.unlockCanvasAndPost(canvas);
2.android/view/Surface
它主要对一些native函数的包装。
private native Canvas lockCanvasNative(Rect dirty);
public native void unlockCanvasAndPost(Canvas canvas);
3.android_view_Surface.cpp
这是native函数的实现。
Surface_lockCanvas它先锁住Surface,从而获取Surface相关的信息,如果格式、宽度、高度和像素缓冲区。然后创建一个bitmap,这个bitmap和共享一个像素缓冲区,这样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();
4.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);
}
5.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);
在private void draw(boolean fullRedrawNeeded)中,会调用lockCanvas,从而获取一个Canvas对象,然后调用递归调用子窗口(View)的draw函数去绘制自己,最后调用unlockCanvasAndPost让Surface把自己更新到屏幕上。
canvas = surface.lockCanvas(dirty);
mView.draw(canvas);
surface.unlockCanvasAndPost(canvas);
2.android/view/Surface
它主要对一些native函数的包装。
private native Canvas lockCanvasNative(Rect dirty);
public native void unlockCanvasAndPost(Canvas canvas);
3.android_view_Surface.cpp
这是native函数的实现。
Surface_lockCanvas它先锁住Surface,从而获取Surface相关的信息,如果格式、宽度、高度和像素缓冲区。然后创建一个bitmap,这个bitmap和共享一个像素缓冲区,这样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();
4.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);
}
5.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 GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI 的更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android GUI 的更新过程
- Android GUI更新过程
- Android GUI更新过程
- Android 中的 framebuffer 和SurFace的关系(GUI更新过程)
- 更新过程
- Android画布更新过程OnDraw调用过程
- Android sdk更新过程中出现问题 和导包问题
- Android源码分析之WindowManager.LayoutParams属性更新过程
- Android源码分析之WindowManager.LayoutParams属性更新过程
- Android源码分析之WindowManager.LayoutParams属性更新过程
- ANDROID GUI
- 第一章 Hadoop启动Shell启动脚本分析--基于hadoop-0.20.2-cdh3u1
- js中Date类型数据的处理
- 剖析javscript中类、prototype及new实例之间的关系
- sql server 2008 数据库 索引
- Lookup Table
- Android GUI更新过程
- java 上传文件代码,支持中文文件名和中文文件内容,可以同时提交多个参数
- UNIX 缩写风格
- 获取最顶端窗体的句柄 【C#】
- 改变PopUpManager以模态方式弹出来的窗口的背景色、粗糙度、透明度
- TCC7901 调试过程
- Javascript类
- GBK和UTF8之间的转换 C语言
- 使用cout格式化输出字符串