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

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

พื้นผิว

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

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

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

การแสดงภาพแคนวาส

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

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

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

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

SurfaceHolder

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

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