Surface และ SurfaceHolder

วัตถุพื้นผิวทำให้แอปสามารถแสดงภาพเพื่อนำเสนอบนหน้าจอได้ อินเทอร์เฟซ SurfaceHolder ช่วยให้แอปสามารถแก้ไขและควบคุมพื้นผิวได้

พื้นผิว

พื้นผิว เป็นอินเทอร์เฟซสำหรับผู้ผลิตเพื่อแลกเปลี่ยนบัฟเฟอร์กับผู้บริโภค

โดยทั่วไปแล้ว BufferQueue สำหรับพื้นผิวการแสดงผลจะถูกกำหนดค่าสำหรับการบัฟเฟอร์สามเท่า บัฟเฟอร์ถูกจัดสรรตามความต้องการดังนั้นหากผู้ผลิตสร้างบัฟเฟอร์ช้าพอเช่นที่ 30 fps บนจอแสดงผล 60 fps อาจมีบัฟเฟอร์ที่จัดสรรเพียงสองรายการในคิว การจัดสรรบัฟเฟอร์ตามความต้องการช่วยลดการใช้หน่วยความจำ คุณสามารถดูข้อมูลสรุปของบัฟเฟอร์ที่เกี่ยวข้องกับทุกเลเยอร์ในเอาต์พุต dumpsys SurfaceFlinger ทิ้ง

ลูกค้าส่วนใหญ่แสดงผลบนพื้นผิวโดยใช้ OpenGL ES หรือ Vulkan อย่างไรก็ตามไคลเอนต์บางรายแสดงผลบนพื้นผิวโดยใช้ผ้าใบ

การเรนเดอร์แคนวาส

การใช้งานแคนวาสมีให้โดย ไลบรารีกราฟิก Skia หากคุณต้องการวาดสี่เหลี่ยมผืนผ้าคุณเรียก Canvas API ซึ่งกำหนดไบต์ในบัฟเฟอร์อย่างเหมาะสม เพื่อให้แน่ใจว่าบัฟเฟอร์ไม่ได้รับการอัปเดตโดยไคลเอนต์สองรายพร้อมกันหรือเขียนถึงในขณะที่แสดงอยู่ให้ล็อกบัฟเฟอร์เพื่อเข้าถึง ใช้คำสั่งต่อไปนี้เพื่อทำงานกับแคนวาสล็อก:

  • lockCanvas() ล็อกบัฟเฟอร์สำหรับการแสดงผลบน CPU และส่งคืน Canvas เพื่อใช้สำหรับการวาด
  • unlockCanvasAndPost() ปลดล็อกบัฟเฟอร์และส่งไปยังผู้เรียบเรียง
  • lockHardwareCanvas() ล็อกบัฟเฟอร์สำหรับการแสดงผลบน GPU และส่งคืนผืนผ้าใบเพื่อใช้สำหรับการวาดภาพ

ในครั้งแรกที่ผู้ผลิตร้องขอบัฟเฟอร์จาก BufferQueue บัฟเฟอร์จะถูกจัดสรรและเตรียมข้อมูลเบื้องต้นเป็นศูนย์ การเริ่มต้นเป็นสิ่งที่จำเป็นเพื่อหลีกเลี่ยงการแชร์ข้อมูลระหว่างกระบวนการโดยไม่ได้ตั้งใจ อย่างไรก็ตามหากคุณใช้บัฟเฟอร์ซ้ำเนื้อหาก่อนหน้านี้จะยังคงอยู่ หากคุณเรียก lockCanvas() และ unlockCanvasAndPost() ซ้ำ ๆ โดยไม่ต้องวาดอะไรเลยผู้ผลิตจะวนระหว่างเฟรมที่แสดงผลก่อนหน้านี้

รหัสล็อค / ปลดล็อคพื้นผิวจะอ้างอิงถึงบัฟเฟอร์ที่แสดงผลก่อนหน้านี้ หากคุณระบุพื้นที่สกปรกเมื่อล็อคพื้นผิวจะคัดลอกพิกเซลที่ไม่สกปรกจากบัฟเฟอร์ก่อนหน้า SurfaceFlinger หรือ HWC มักจะจัดการบัฟเฟอร์ แต่เนื่องจากเราจำเป็นต้องอ่านจากบัฟเฟอร์เท่านั้นจึงไม่จำเป็นต้องรอการเข้าถึงแบบเอกสิทธิ์เฉพาะบุคคล

SurfaceHolder

SurfaceHolder เป็นอินเทอร์เฟซที่ระบบใช้เพื่อแบ่งปันความเป็นเจ้าของพื้นผิวกับแอป ไคลเอนต์บางรายที่ทำงานกับพื้นผิวต้องการ SurfaceHolder เนื่องจาก API ในการรับและตั้งค่าพารามิเตอร์พื้นผิวจะดำเนินการผ่าน SurfaceHolder SurfaceView มี SurfaceHolder

ส่วนประกอบส่วนใหญ่ที่โต้ตอบกับมุมมองเกี่ยวข้องกับ SurfaceHolder API อื่น ๆ บางตัวเช่น MediaCodec ทำงานบนพื้นผิวเอง