เลเยอร์และจอแสดงผล

เลเยอร์และจอแสดงผลเป็นองค์ประกอบพื้นฐาน 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 เพื่อจับภาพการเปิดใช้จอแสดงผล แล้วเล่นภาพย้อนกลับทีละเฟรม