พื้นผิวและที่วางพื้นผิว

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

พื้นผิว

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

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

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

เรนเดอร์ผ้าใบ

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

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

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

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

SurfaceHolder

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

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