Surface และ SurfaceHolder

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

Surface

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

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

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

การแสดงผล Canvas

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

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

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

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

SurfaceHolder

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

คอมโพเนนต์ส่วนใหญ่ที่โต้ตอบกับ View จะเกี่ยวข้องกับ SurfaceHolder API อื่นๆ บางรายการ เช่น MediaCodec จะทำงานบน Surface เอง