1.1.1 handlePageFlip
PageFlip可以理解為“翻頁”。從這個意思上來看,它應該與圖層緩衝區有關係——因為是多緩衝機制,在適當的時機,我們就需要做“翻頁”的動作。
void SurfaceFlinger::handlePageFlip()
{…
const DisplayHardware&hw = graphicPlane(0).displayHardware();//編號為0的Display
const RegionscreenRegion(hw.bounds());//整個螢幕地區
const LayerVector¤tLayers(mDrawingState.layersSortedByZ);/*當前所有layers*/
const bool visibleRegions = lockPageFlip(currentLayers);/*Step1.下面會詳細分析這個函數,注意它的返回
值是一個bool類型變數。*/
if (visibleRegions ||mVisibleRegionsDirty) {//可見地區發生變化
RegionopaqueRegion;//不透明地區
computeVisibleRegions(currentLayers, mDirtyRegion, opaqueRegion);/*Step2.計算可見地區*/
/*Step3.重建mVisibleLayersSortedByZ,即所有可見圖層的排序*/
const size_t count= currentLayers.size();
mVisibleLayersSortedByZ.clear();//清空
mVisibleLayersSortedByZ.setCapacity(count);//容量
for (size_t i=0 ;i<count ; i++) {
if(!currentLayers[i]->visibleRegionScreen.isEmpty())//當前圖層有可見地區
mVisibleLayersSortedByZ.add(currentLayers[i]);
}
mWormholeRegion = screenRegion.subtract(opaqueRegion);/*Step4.蟲洞計算*/
mVisibleRegionsDirty = false;
invalidateHwcGeometry();
}
unlockPageFlip(currentLayers);/*Step5.與lockPageFlip相對應 */
…
mDirtyRegion.andSelf(screenRegion);//排除螢幕範圍之外的地區
}