วัตถุพื้นผิวทำให้แอปสามารถแสดงภาพเพื่อนำเสนอบนหน้าจอได้ อินเทอร์เฟซ 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 ทำงานบนพื้นผิวเอง