WEB开发网
开发学院手机开发Android 开发 Android Display System Surface Flinger 阅读

Android Display System Surface Flinger

 2010-05-26 06:18:00 来源:WEB开发网   
核心提示:前面几个步骤是通用的:// 要使用 Surfaceflinger 的服务必须先创建一个 clientsp client = new SurfaceComposerClient();// 然后向 Surfaceflinger 申请一个 Surface , surface 类型为 PushBufferssp surface

前面几个步骤是通用的:

// 要使用 Surfaceflinger 的服务必须先创建一个 client

sp client = new SurfaceComposerClient();

// 然后向 Surfaceflinger 申请一个 Surface , surface 类型为 PushBuffers

sp surface = client->createSurface(getpid(), 0, 320, 240,

PIXEL_FORMAT_UNKNOWN, ISurfaceComposer::ePushBuffers);

// 然后取得 ISurface 这个接口, getISurface() 这个函数的调用时具有权限限制的,必须在 Surface.h 中打开: /framewoks/base/include/ui/Surface.h

sp isurface = Test::getISurface(surface);

//overlay 方式下就创建 overlay ,然后就可以使用 overlay 的接口了

sp ref = isurface->createOverlay(320, 240, PIXEL_FORMAT_RGB_565);

sp verlay = new Overlay(ref);

//post buffer 方式下,首先要创建一个 buffer ,然后将 buffer 注册到 ISurface 上

ISurface::BufferHeap buffers(w, h, w, h,

PIXEL_FORMAT_YCbCr_420_SP,

transform,

0,

mHardware->getPreviewHeap());

mSurface->registerBuffers(buffers);

3.2 、应用 程序对窗口的控制和画图

Surface 创建以后,应用程序就可以在 buffer 中画图了,这里就面对着两个问题了,一个是怎么知道在哪个 buffer 上来画图,还一个就是画图以后如何通知 SurfaceFlinger 来进行 flip 。除了画图之外,如果我们移动窗口以及改变窗口大小的时候,如何告诉 SurfaceFlinger 来进行处理呢 ?在明白这些问题之前,首先我们要了解 SurfaceFlinger 这个服务 是如何运作的:

从类图中可以看到 SurfaceFlinger 是一个线程类,它继承了 Thread 类。当创建 SurfaceFlinger 这个服务的时候会启动一个 SurfaceFlinger 监听线程,这个线程会一直等待事件的发生,比如说需要进行 sruface flip ,或者说窗口位置大小发生了变化等等,一旦产生这些事件, SurfaceComposerClient 就会通过 IBinder 发出信号,这个线程就会结束等待处理这些事件,处理完成以后会继续等待,如此循环。

SurfaceComposerClient 和 SurfaceFlinger 是通过 SurfaceFlingerSynchro 这个类来同步信号的,其实说穿了就是一个条件变量。监听线程等待条件的值变成 OPEN ,一旦变成 OPEN 就结束等待并将条件置成 CLOSE

上一页  1 2 3 4 5 6 7 8  下一页

Tags:Android Display System

编辑录入:coldstar [复制链接] [打 印]
赞助商链接