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