ออบเจ็กต์พื้นผิวช่วยให้แอปแสดงภาพบนหน้าจอได้ อินเทอร์เฟซ SurfaceHolder ช่วยให้แอปแก้ไขและควบคุมพื้นผิวได้
พื้นผิว
Surface คืออินเทอร์เฟซสำหรับผู้ผลิตในการแลกเปลี่ยนบัฟเฟอร์กับผู้บริโภค
โดยปกติแล้ว BufferQueue สำหรับพื้นผิวการแสดงผลจะได้รับการกําหนดค่าสำหรับการบัฟเฟอร์ 3 ชั้น ระบบจะจัดสรรบัฟเฟอร์ตามคําขอ ดังนั้นหากผู้ผลิตสร้างบัฟเฟอร์ช้ามาก เช่น ที่ 30 เฟรมต่อวินาทีบนจอแสดงผล 60 เฟรมต่อวินาที ก็อาจมีบัฟเฟอร์ที่จัดสรรไว้เพียง 2 รายการในคิว
การจัดสรรบัฟเฟอร์ตามดีมานด์จะช่วยลดความสิ้นเปลืองหน่วยความจํา คุณจะเห็นสรุปของบัฟเฟอร์ที่เชื่อมโยงกับเลเยอร์ทุกเลเยอร์ในเอาต์พุต dumpsys SurfaceFlinger
ไคลเอ็นต์ส่วนใหญ่แสดงผลบนพื้นผิวโดยใช้ OpenGL ES หรือ Vulkan อย่างไรก็ตาม ลูกค้าบางรายจะแสดงผลบนแพลตฟอร์มโดยใช้ Canvas
การแสดงผลแคนวาส
การติดตั้งใช้งาน Canvas มาจากSkia Graphics Library หากต้องการวาดสี่เหลี่ยมผืนผ้า ให้เรียกใช้ Canvas API ซึ่งจะตั้งค่าไบต์ในบัฟเฟอร์อย่างเหมาะสม ล็อกบัฟเฟอร์เพื่อเข้าถึงบัฟเฟอร์นั้นเพื่อให้แน่ใจว่าไคลเอ็นต์ 2 รายจะไม่อัปเดตบัฟเฟอร์พร้อมกันหรือเขียนข้อมูลขณะที่แสดงอยู่ ใช้คำสั่งต่อไปนี้เพื่อทำงานกับล็อกแบบผ้าใบ
lockCanvas()
จะล็อกบัฟเฟอร์สำหรับการเรนเดอร์ใน CPU และแสดงผล Canvas เพื่อใช้วาดunlockCanvasAndPost()
ปลดล็อกบัฟเฟอร์และส่งไปยังคอมโพสิตlockHardwareCanvas()
จะล็อกบัฟเฟอร์สำหรับการเรนเดอร์ใน GPU และแสดงผลผืนผ้าใบสำหรับวาดภาพ
เมื่อผู้ผลิตขอบัฟเฟอร์จาก BufferQueue เป็นครั้งแรก ระบบจะจัดสรรและเริ่มต้นบัฟเฟอร์เป็น 0 จำเป็นต้องทำการเริ่มต้นเพื่อหลีกเลี่ยงการแชร์ข้อมูลระหว่างกระบวนการโดยไม่ตั้งใจ อย่างไรก็ตาม หากคุณใช้บัฟเฟอร์ซ้ำ เนื้อหาก่อนหน้าจะยังคงอยู่ หากคุณเรียกใช้ lockCanvas()
และ unlockCanvasAndPost()
ซ้ำๆ โดยไม่วาดอะไรเลย โปรแกรมจะแสดงเฟรมที่ผ่านการจัดการแสดงผลแล้วก่อนหน้านี้ซ้ำๆ
โค้ดล็อก/ปลดล็อกพื้นผิวจะเก็บการอ้างอิงไปยังบัฟเฟอร์ที่แสดงผลก่อนหน้านี้ หากคุณระบุพื้นที่ที่เปลี่ยนแปลงเมื่อล็อกพื้นผิว ระบบจะคัดลอกพิกเซลที่ไม่เปลี่ยนแปลงจากบัฟเฟอร์ก่อนหน้า โดยปกติแล้ว SurfaceFlinger หรือ HWC จะจัดการบัฟเฟอร์ แต่เนื่องจากเราจําเป็นต้องอ่านจากบัฟเฟอร์เท่านั้น จึงไม่ต้องรอการเข้าถึงแบบมีสิทธิ์เฉพาะ
SurfaceHolder
SurfaceHolder คืออินเทอร์เฟซที่ระบบใช้เพื่อแชร์การเป็นเจ้าของแพลตฟอร์มกับแอป ไคลเอ็นต์บางรายการที่ทำงานกับพื้นผิวต้องการ SurfaceHolder เนื่องจากมีการนํา API ในการรับและตั้งค่าพารามิเตอร์พื้นผิวมาใช้ผ่าน SurfaceHolder SurfaceView มี SurfaceHolder
คอมโพเนนต์ส่วนใหญ่ที่โต้ตอบกับมุมมองจะมี SurfaceHolder เกี่ยวข้อง API อื่นๆ บางรายการ เช่น MediaCodec จะทำงานบนแพลตฟอร์มนั้นๆ