Android 12(S) SurfaceView/SurfaceFlinger/BLASTBufferQueue 零星點記錄,好煩
阿新 • • 發佈:2021-12-02
Android S 相對於Android R 在SurfaceView/SurfaceFlinger部分,程式碼有諸多改動,
建立SurfaceView時,呼叫到updateSurface
第一次需要建立時呼叫到createBlastSurfaceControls
在createBlastSurfaceControls中可以看到會去建立3個SurfaceControl:mSurfaceControl, mBlastSurfaceControl, mBackgroundControl
摘抄主要程式碼:
點選檢視程式碼
mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession) .setName(name) .setLocalOwnerView(this) .setParent(viewRoot.getBoundsLayer()) .setCallsite("SurfaceView.updateSurface") .setContainerLayer() .build(); ///// mBlastSurfaceControl = new SurfaceControl.Builder(mSurfaceSession) .setName(name + "(BLAST)") .setLocalOwnerView(this) .setParent(mSurfaceControl) .setFlags(mSurfaceFlags) .setHidden(false) .setBLASTLayer() .setCallsite("SurfaceView.updateSurface") .build(); ///// private SurfaceControl createBackgroundControl(String name) { return new SurfaceControl.Builder(mSurfaceSession) .setName("Background for " + name) .setLocalOwnerView(this) .setOpaque(true) .setColorLayer() .setParent(mSurfaceControl) .setCallsite("SurfaceView.updateSurface") .build(); }
分別對應的Surface的name:
- "SurfaceView[" + viewRoot.getTitle().toString() + "]"
- "SurfaceView[" + viewRoot.getTitle().toString() + "]" + "(BLAST)"
- "Background for " + "SurfaceView[" + viewRoot.getTitle().toString() + "]"
關係:
- mSurfaceControl.setParent(viewRoot.getBoundsLayer())
- mBlastSurfaceControl.setParent(mSurfaceControl)
- mBackgroundControl.setParent(mSurfaceControl)
這裡有個新東西,先隨便瞧瞧吧
mBlastBufferQueue = new BLASTBufferQueue(name, mBlastSurfaceControl, mSurfaceWidth, mSurfaceHeight, mFormat);
再回到updateSurface函式裡:==>performSurfaceTransaction
心有猛虎,細嗅薔薇,生活就該無懼無悔 ---------------------------------------------------------------------------- 作者:二的次方 出處:https://www.cnblogs.com/roger-yu/p/15633380.html 本文版權歸作者和部落格園共有,轉載必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利