您的位置:华清远见教育科技集团 >> 新闻动态 >> Android资料 >> Android Surface渲染管理  
 
Android Surface渲染管理
分享到:

当窗口的内容或者状态发生变化时,Surface Flinger就会在监听线程中监听到相关的事件,并进行处理。首先判断事件是不是控制台信号,如果是控制台信号,就调用handleConsoleEvents()方法进行控制台信号的处理,获取渲染的区域;当交易处理完成时,Surface Flinger会在handleTransaction()方法中遍历Z-order上的Layer,移去已经被销毁的Layer;接下来Surface Flinger会遍历LayerVector,计算每个Layer的可视区域,如果需要重绘,在handleRepaint()方法中会进行Layer组合,当组合完成后,会发送消息compositionComplete()通知硬件Layer组合已经完成,然后进行Surface的渲染。

下面是Surface Flinger的监听线程处理事件的实现过程:

代码:Surface Flinger的监听线程处理事件的实现过程

bool SurfaceFlinger::threadLoop()
    {
    waitForEvent();    //超时时间为5s
    if (UNLIKELY(mConsoleSignals)) {
        handleConsoleEvents();
        }
    if (LIKELY(mTransactionCount==0)) {
    const uint32_t mask=eTransactionNeeded | eTraversalNeeded;
    uint32_t transactionFlags=getTransactionFlags(mask);
    if (LIKELY(transactionFlags)) {
        handleTransaction(transactionFlags);
        }
    }
    handlePageFlip();
    const DisplayHardware& hw(graphicPlane(0).displayHardware());
    if (LIKELY(hw.canDraw() && !isFrozen())) {
        handleRepaint();
        hw.compositionComplete();
        unlockClients();     //客户端解锁
        postFramebuffer();    //前后端缓冲切换,显示
    } else {
        unlockClients();
        usleep(16667);
        }
    return true;
    }

关于Surface,还有一个十分重要的概念就是layer_state_t,根据窗口状态的变化,Layer处于不同的状态。layer_state_t的值包括ePositionChanged、eLayerChanged、eSizeChanged、eAlphaChanged、eMatrixChanged、eTransparentRegionChanged、eVisibilityChanged等。当发生eLayerChanged变化时,说明缓冲需要切换。另外,不论layer_state_t值发生了何种变化,都需要重新遍历Layer,进行相应的重绘。

一般而言,屏幕的渲染需要重绘Surface的所有像素,但是出于提高效率和速率的需要,在现代的设计上,会通过分析只重绘发生变化的区域。这部分的内容主要位于framebuffer.cpp的fb_post()函数中。在“LayerBuffer”和“LayerDim”模式的Layer中也有采用。

在Surface上层,主要由窗口管理器来控制着窗口的变化。窗口管理器创建Surface的过程如图-1所示。

流程说明:

当Windows Manager要创建Surface时,首先会创建一个Java Surface对象,Java Surface对象通过Java JNI会获得一个SurfaceComposerClient句柄,然后通过SurfaceComposerClient向Surface Flinger请求创建一个原生层的C++ Surface对象和一个SurfaceControl对象。在Surface Flinger中,根据标志位(PUSH_BUFFERS、FX_SURFACE_NORMAL、FX_SURFACE_BLUR、FX_SURFACE_DIM)的不同,调用相应的方法创建相应类型的Layer。每个Surface都有一个唯一的标识符SurfaceID。

为了执行窗口的操作,需要调用Surface.openTransaction()方法打开交易(Transaction)。在原生层,SurfaceFlinger会调用openGlobalTransaction()方法增加交易记数(mTransactionCount),并将交易ID保存在gActiveConnections向量中。

Windows Manager通过调用Surface. setPosition()方法可以设置Surface的位置,当SurfaceComposerClient收到设置Surface位置的请求时,会将layer_state_t状态设为ISurfaceComposer::ePositionChanged,Surface Flinger在收到位置变化的消息后,会在其监听线程中进行处理。

Windows Manager通过调用Surface. setLayer ()方法可以设置Surface的Layer,当SurfaceComposerClient收到设置Surface的Layer请求时,会将layer_state_t状态设为ISurfaceComposer::eLayerChanged,Surface Flinger在收到Layer变化的消息后,会在其监听线程中进行处理。

图-1 Surface的创建过程

如果希望隐藏已经创建的Surface,需要调用Surface.hide()来调用原生层的SurfaceComposerClient::hide()方法,SurfaceComposerClient会将其标志位和掩码均设为ISurfaceComposer::eLayerHidden,并向Surface Flinger发送ISurfaceComposer:: eVisibility Changed消息。

当交易结束时,Windows Manager需要通过Surface.closeTransaction()方法通知原生层交易结束。

需要说明的是,交易过程中的Java Surface对原生层C++ Surface的调用,是通过SurfaceControl对象来进行的。

 更多相关文章

·Android LayerBuffer模式的layer渲染
·Android应用程序之WebApp开发实战
·从开发到盈利--安卓程序商业化之路
·Android Layer纹理重载的实现
·Android Surface Flinger 服务器概述