1. 程式人生 > 其它 >Android 12(S) SurfaceView/SurfaceFlinger/BLASTBufferQueue 零星點記錄,好煩

Android 12(S) SurfaceView/SurfaceFlinger/BLASTBufferQueue 零星點記錄,好煩

Android S 相對於Android R 在SurfaceView/SurfaceFlinger部分,程式碼有諸多改動,

建立SurfaceView時,呼叫到updateSurface

http://aosp.opersys.com/xref/android-12.0.0_r2/xref/frameworks/base/core/java/android/view/SurfaceView.java#1065

第一次需要建立時呼叫到createBlastSurfaceControls

http://aosp.opersys.com/xref/android-12.0.0_r2/xref/frameworks/base/core/java/android/view/SurfaceView.java#1326

在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);

http://aosp.opersys.com/xref/android-12.0.0_r2/xref/frameworks/base/core/java/android/view/SurfaceView.java#1367

再回到updateSurface函式裡:==>performSurfaceTransaction

心有猛虎,細嗅薔薇,生活就該無懼無悔 ---------------------------------------------------------------------------- 作者:二的次方 出處:https://www.cnblogs.com/roger-yu/p/15633380.html 本文版權歸作者和部落格園共有,轉載必須給出原文連結,並保留此段宣告,否則保留追究法律責任的權利