เลเยอร์และจอแสดงผลเป็นองค์ประกอบพื้นฐาน 2 อย่างที่ใช้แสดงการคอมโพสและการทำงานร่วมกับฮาร์ดแวร์ของจอแสดงผล
เลเยอร์
เลเยอร์คือหน่วยที่สำคัญที่สุดในการจัดองค์ประกอบ เลเยอร์คือ
ชุดค่าผสมของ surface และอินสแตนซ์ของ
SurfaceControl
แต่ละเลเยอร์จะมีชุดคุณสมบัติที่
กำหนดวิธีการโต้ตอบกับเลเยอร์อื่นๆ ดูรายละเอียดคุณสมบัติของเลเยอร์ได้ในตารางด้านล่าง
พร็อพเพอร์ตี้ | คำอธิบาย |
---|---|
ตามตำแหน่ง | กำหนดตําแหน่งที่เลเยอร์จะปรากฏบนจอแสดงผล มีข้อมูล เช่น ตำแหน่งของขอบเลเยอร์และลําดับ Z ของเลเยอร์นั้นๆ เมื่อเทียบกับเลเยอร์อื่นๆ (ควรอยู่ข้างหน้าหรือหลังเลเยอร์อื่นๆ) |
เนื้อหา | กำหนดวิธีนำเสนอเนื้อหาที่แสดงในเลเยอร์ภายในขอบเขตที่กําหนดโดยพร็อพเพอร์ตี้ตำแหน่ง มีข้อมูล เช่น ครอบตัด (เพื่อขยายเนื้อหาบางส่วนให้เต็มขอบเขตของเลเยอร์) และการเปลี่ยนรูปแบบ (เพื่อแสดงเนื้อหาที่พลิกหรือหมุน) |
การเรียบเรียง | กำหนดวิธีการผสมเลเยอร์กับเลเยอร์อื่นๆ รวม ข้อมูล เช่น โหมดผสานและค่าอัลฟ่าที่กว้างของเลเยอร์สำหรับอัลฟ่า การประกอบองค์ประกอบ |
การเพิ่มประสิทธิภาพ | ให้ข้อมูลที่ไม่ใช่ข้อมูลที่จำเป็นอย่างยิ่งในการคอมโพสเลเยอร์อย่างถูกต้อง แต่อุปกรณ์เครื่องมือแต่งภาพฮาร์ดแวร์ (HWC) สามารถใช้ข้อมูลดังกล่าวเพื่อเพิ่มประสิทธิภาพการคอมโพส รวมถึงข้อมูล เช่น มองเห็นพื้นที่ของเลเยอร์และส่วนใดของเลเยอร์ อัปเดตตั้งแต่เฟรมก่อนหน้านี้แล้ว |
จอแสดงผล
จอแสดงผลเป็นหน่วยสำคัญในการเรียบเรียง ระบบสามารถ ที่แสดงหลายหน้าจอและ สามารถเพิ่มหรือลบจอแสดงผลได้ในระหว่างการทำงานตามปกติของระบบ จอแสดงผล เพิ่ม/นำออกตามคำขอของ HWC หรือตามคำขอของกรอบโครงสร้าง อุปกรณ์ HWC จะขอเพิ่มหรือนำจอแสดงผลออกเมื่อเชื่อมต่อหรือยกเลิกการเชื่อมต่อจอแสดงผลภายนอกกับอุปกรณ์ ซึ่งเรียกว่าการเสียบปลั๊กร้อน ไคลเอ็นต์จะขอจอแสดงผลเสมือนจริง ซึ่งเนื้อหาจะแสดงผลเป็นบัฟเฟอร์นอกหน้าจอแทนการแสดงผลบนจอจริง
จอแสดงผลเสมือนจริง
SurfaceFlingerรองรับจอแสดงผลภายใน (ติดตั้งไว้ในโทรศัพท์หรือแท็บเล็ต), จอแสดงผลภายนอก (เช่น ทีวีที่เชื่อมต่อผ่าน HDMI) และจอแสดงผลเสมือนอย่างน้อย 1 จอที่แสดงผลรวมภายในระบบ จอแสดงผลเสมือนสามารถ ในการบันทึกหน้าจอหรือส่งหน้าจอผ่านเครือข่าย ระบบจะเขียนเฟรมที่สร้างขึ้นสำหรับจอแสดงผลเสมือนลงใน BufferQueue
จอแสดงผลเสมือนจริงอาจใช้ชุดเลเยอร์เดียวกับจอแสดงผลหลัก (กองเลเยอร์) หรือมีชุดเลเยอร์ของตัวเอง ไม่มี VSYNC สำหรับจอแสดงผลเสมือนจริง ดังนั้น VSYNC สำหรับจอแสดงผลภายในจะทริกเกอร์การคอมโพสสำหรับจอแสดงผลทั้งหมด
ในการใช้งาน HWC ที่รองรับ จอแสดงผลเสมือนจริงจะคอมโพสกับ OpenGL ES (GLES), HWC หรือทั้ง GLES และ HWC ได้ ในการใช้งานที่ไม่รองรับ ระบบจะคอมโพสจอแสดงผลเสมือนโดยใช้ GLES เสมอ
กรณีศึกษา: การบันทึกหน้าจอ
คำสั่ง screenrecord
อนุญาตให้ผู้ใช้
บันทึกทุกอย่างที่ปรากฏบนหน้าจอเป็นไฟล์ .mp4
ในการใช้งาน ทางระบบจะรับเฟรมที่คอมโพสจาก SurfaceFlinger แล้วเขียนเฟรมเหล่านั้นลงในโปรแกรมเข้ารหัสวิดีโอ จากนั้นจึงเขียนข้อมูลวิดีโอที่เข้ารหัสลงในไฟล์ ตัวแปลงรหัสวิดีโอได้รับการจัดการโดยกระบวนการที่แยกต่างหาก
(mediaserver
) ทำให้บัฟเฟอร์กราฟิกขนาดใหญ่ต้องเลื่อนไปมา
ระบบ เป้าหมายคือบันทึกวิดีโอ 60 FPS ที่ความละเอียดเต็ม เพื่อให้ท้าทายยิ่งขึ้น กุญแจสำคัญที่จะทำให้ฟีเจอร์นี้ทำงานได้อย่างมีประสิทธิภาพคือ BufferQueue
คลาส MediaCodec
ช่วยให้แอประบุข้อมูลเป็นไบต์ดิบในบัฟเฟอร์ หรือผ่านแพลตฟอร์มได้ เมื่อ screenrecord
ขอสิทธิ์เข้าถึงวิดีโอ
โปรแกรมเปลี่ยนไฟล์ กระบวนการ mediaserver
จะสร้าง BufferQueue เชื่อมต่อ
ไปยังฝั่งผู้บริโภค จากนั้นส่งด้านผู้ผลิตกลับไปยัง
screenrecord
เป็นแพลตฟอร์ม
จากนั้นยูทิลิตี screenrecord
จะขอให้ SurfaceFlinger สร้างจอแสดงผลเสมือนจริงที่มิเรอร์จอแสดงผลหลัก (กล่าวคือมีเลเยอร์เดียวกันทั้งหมด) และสั่งให้ส่งเอาต์พุตไปยังแพลตฟอร์มที่มาจากกระบวนการ mediaserver
ในกรณีนี้ SurfaceFlinger เป็นผู้ผลิต
มากกว่าผู้บริโภค
หลังจากกําหนดค่าเสร็จแล้ว screenrecord
จะทริกเกอร์เมื่อข้อมูลที่เข้ารหัสปรากฏขึ้น เมื่อแอปวาดภาพ บัฟเฟอร์จะส่งไปยัง SurfaceFlinger ซึ่งจะคอมโพสเป็นบัฟเฟอร์เดียวที่ส่งไปยังโปรแกรมเปลี่ยนไฟล์วิดีโอโดยตรงในกระบวนการ mediaserver
กระบวนการ screenrecord
จะไม่ได้เห็นเฟรมแบบเต็ม เป็นการภายใน
กระบวนการของ mediaserver
มีวิธีย้ายบัฟเฟอร์ที่แตกต่างกันไป
ส่งข้อมูลตามแฮนเดิลด้วยเช่นกัน ซึ่งช่วยลดภาระค่าใช้จ่าย
กรณีศึกษา: จำลองจอแสดงผลสำรอง
WindowManager สามารถขอให้ SurfaceFlinger สร้างเลเยอร์ที่มองเห็นได้ ซึ่ง SurfaceFlinger จะทำหน้าที่เป็นผู้บริโภค BufferQueue นอกจากนี้ คุณยังขอให้ SurfaceFlinger สร้างจอแสดงผลเสมือนจริงได้ โดยที่ SurfaceFlinger จะทำหน้าที่เป็น BufferQueue Producer
หากคุณเชื่อมต่อจอแสดงผลเสมือนกับเลเยอร์ที่มองเห็นได้ ระบบจะสร้างลูปปิดขึ้น ซึ่งหน้าจอคอมโพสิตจะปรากฏในหน้าต่าง หน้าต่างนั้นตอนนี้เป็นส่วนหนึ่งของ
เอาต์พุตแบบผสม ดังนั้นในการรีเฟรชภาพแบบผสมภายในหน้าต่างในครั้งถัดไป
แสดงเนื้อหาในหน้าต่างด้วย หากต้องการดูการทํางาน ให้เปิดใช้ตัวเลือกสําหรับนักพัฒนาซอฟต์แวร์ในการตั้งค่า เลือกจําลองจอแสดงผลรอง แล้วเปิดใช้หน้าต่าง หากต้องการดูการทำงานของจอแสดงผลรอง ให้ใช้ screenrecord
เพื่อจับภาพการเปิดใช้จอแสดงผล แล้วเล่นภาพย้อนกลับทีละเฟรม