转载请注明:From LXS. http://blog.csdn.net/uiop78uiop78/
GUI系统之SurfaceFlinger章节目录:
blog.csdn.net/uiop78uiop78/article/details/8954508
1.1.1 handleTransaction
有两个相似的函数,handleTransaction需要获取mStateLock锁,执行handleTransactionLocked,最后再将mHwWorkListDirty置为true。
后一个handleTransactionLocked才是真正处理业务的地方。从前面我们对transactionflags的解释来推断,它的具体工作应该会分为两部分,即traversal(对应eTraversalNeeded)和transaction(对应eTransactionNeeded)。
void SurfaceFlinger::handleTransactionLocked(uint32_ttransactionFlags)
{
const LayerVector¤tLayers(mCurrentState.layersSortedByZ);
const size_t count =currentLayers.size();
/*第一部分,traversal所有layer*/
const boollayersNeedTransaction = transactionFlags & eTraversalNeeded;
if (layersNeedTransaction){//是否需要traversal
for (size_t i=0 ; i<count ; i++) {//逐个layer来处理
constsp<LayerBase>& layer = currentLayers[i];
uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded);/*这个layer是否
需要doTransaction*/
if (!trFlags)continue;//如果不需要的话,直接进入下一个
const uint32_tflags = layer->doTransaction(0);//由各layer做内部处理,下面会做详细分析
if (flags &Layer::eVisibleRegion)//各layer计算可见区域是否变化
mVisibleRegionsDirty = true;//可见区域发生变化
}
}
/*第二部分,SurfaceFlinger执行transaction*/
if (transactionFlags &eTransactionNeeded) {