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

เลเยอร์และจอแสดงผลเป็นองค์ประกอบพื้นฐาน 2 อย่างที่ใช้แสดงการคอมโพสและการทำงานร่วมกับฮาร์ดแวร์ของจอแสดงผล

เลเยอร์

เลเยอร์คือหน่วยที่สำคัญที่สุดในการจัดองค์ประกอบ เลเยอร์คือพื้นผิวที่รวมกับอินสแตนซ์ของ SurfaceControl เลเยอร์แต่ละเลเยอร์มีชุดพร็อพเพอร์ตี้ที่กําหนดวิธีโต้ตอบกับเลเยอร์อื่นๆ พร็อพเพอร์ตี้เลเยอร์มีคำอธิบายอยู่ในตารางด้านล่าง

พร็อพเพอร์ตี้ คำอธิบาย
ตำแหน่ง กำหนดตําแหน่งที่เลเยอร์จะปรากฏบนจอแสดงผล มีข้อมูล เช่น ตำแหน่งของขอบเลเยอร์และลําดับ Z ของเลเยอร์นั้นๆ เมื่อเทียบกับเลเยอร์อื่นๆ (ควรอยู่ข้างหน้าหรือหลังเลเยอร์อื่นๆ)
เนื้อหา กำหนดวิธีนำเสนอเนื้อหาที่แสดงในเลเยอร์ภายในขอบเขตที่กําหนดโดยพร็อพเพอร์ตี้ตำแหน่ง มีข้อมูล เช่น ครอบตัด (เพื่อขยายเนื้อหาบางส่วนให้เต็มขอบเขตของเลเยอร์) และการเปลี่ยนรูปแบบ (เพื่อแสดงเนื้อหาที่พลิกหรือหมุน)
การเรียบเรียง กำหนดวิธีคอมโพสเลเยอร์กับเลเยอร์อื่นๆ มีข้อมูล เช่น โหมดการผสมและค่าอัลฟาทั้งเลเยอร์สําหรับการคอมโพสอัลฟา
การเพิ่มประสิทธิภาพ เป็นข้อมูลที่ไม่จำเป็นจริงๆ ในการประกอบเลเยอร์อย่างถูกต้อง แต่อุปกรณ์ ฮาร์ดแวร์ Composer (HWC) สามารถใช้เพื่อเพิ่มประสิทธิภาพในการจัดวางองค์ประกอบได้ มีข้อมูล เช่น บริเวณที่มองเห็นได้ของเลเยอร์และส่วนที่อัปเดตของเลเยอร์นับตั้งแต่เฟรมก่อนหน้า

จอแสดงผล

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

จอแสดงผลเสมือนจริง

SurfaceFlingerรองรับจอแสดงผลภายใน (ติดตั้งไว้ในโทรศัพท์หรือแท็บเล็ต), จอแสดงผลภายนอก (เช่น ทีวีที่เชื่อมต่อผ่าน HDMI) และจอแสดงผลเสมือนอย่างน้อย 1 จอที่แสดงผลรวมภายในระบบ จอแสดงผลเสมือนสามารถใช้เพื่อบันทึกหน้าจอหรือส่งหน้าจอผ่านเครือข่ายได้ ระบบจะเขียนเฟรมที่สร้างขึ้นสำหรับจอแสดงผลเสมือนลงใน BufferQueue

จอแสดงผลเสมือนอาจใช้เลเยอร์ชุดเดียวกันกับจอแสดงผลหลัก (กลุ่มเลเยอร์) หรือมีชุดของตัวเอง ไม่มี VSYNC สำหรับจอแสดงผลเสมือน ดังนั้น VSYNC สำหรับจอแสดงผลภายในจะทริกเกอร์การจัดวางองค์ประกอบสำหรับจอแสดงผลทั้งหมด

ในการใช้งาน HWC ที่รองรับ จอแสดงผลเสมือนจริงจะคอมโพสกับ OpenGL ES (GLES), HWC หรือทั้ง GLES และ HWC ได้ ในการใช้งานที่ไม่รองรับ จอแสดงผลเสมือนจะได้รับการประกอบโดยใช้ GLES เสมอ

กรณีศึกษา: screenrecord

คำสั่ง 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

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