ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) สามารถเปลี่ยนแบบไดนามิกบนอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ที่มี HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ Android TV (STB) และแบบ over-the-top (OTT) อุปกรณ์ การเปลี่ยนแปลงนี้อาจเกิดขึ้นจากสัญญาณฮอตปลั๊ก HDMI เช่น เมื่อผู้ใช้สลับจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่ง หรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่ออยู่ Android 12 ขึ้นไปมีการเปลี่ยนแปลงในเฟรมเวิร์กเพื่อรองรับความสามารถในการเสียบปลั๊กและการแสดงผลแบบไดนามิก
หน้านี้อธิบายการจัดการฮอตปลั๊กของจอแสดงผลและการเปลี่ยนแปลงความสามารถในการแสดงผลในการใช้งาน Composer HAL นอกจากนี้ยังกล่าวถึงวิธีการจัดการเฟรมบัฟเฟอร์ที่เกี่ยวข้องและป้องกันสภาพการแข่งขันในสถานการณ์เหล่านี้
อัพเดตความสามารถในการแสดงผล
ส่วนนี้จะอธิบายวิธีที่เฟรมเวิร์ก Android จัดการกับการเปลี่ยนแปลงความสามารถในการแสดงผลที่เริ่มต้นโดย Composer HAL
ก่อนที่ Android จะสามารถจัดการกับการเปลี่ยนแปลงความสามารถในการแสดงผลได้อย่างเหมาะสม OEM จะต้องใช้งาน Composer HAL เพื่อให้ใช้ onHotplug(display, connection=CONNECTED)
เพื่อแจ้งกรอบการทำงานเกี่ยวกับการเปลี่ยนแปลงความสามารถในการแสดงผล หลังจากที่ปรับใช้แล้ว Android จะจัดการกับการเปลี่ยนแปลงความสามารถในการแสดงดังต่อไปนี้:
- เมื่อตรวจพบการเปลี่ยนแปลงในความสามารถในการแสดงผล กรอบงานจะได้รับการแจ้งเตือน
onHotplug(display, connection=CONNECTED)
- เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะทิ้งสถานะการแสดงผลและสร้างใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้เมธอด
getActiveConfig
,getDisplayConfigs
,getDisplayAttribute
,getColorModes
,getHdrCapabilities
และgetDisplayCapabilities
- หลังจากที่เฟรมเวิร์กสร้างสถานะการแสดงผลใหม่อีกครั้ง เฟรมเวิร์กจะส่งการเรียกกลับ
onDisplayChanged
ไปยังแอปที่กำลังรับฟังเหตุการณ์ดังกล่าว
เฟรมเวิร์กจะจัดสรร framebuffers ใหม่บนเหตุการณ์ onHotplug(display, connection=CONNECTED)
ที่ตามมา ดู การจัดการ framebuffer ของไคลเอ็นต์ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการจัดการหน่วยความจำ framebuffer อย่างเหมาะสมเพื่อหลีกเลี่ยงความล้มเหลวในระหว่างการจัดสรร framebuffer ใหม่
จัดการกับสถานการณ์การเชื่อมต่อทั่วไป
ส่วนนี้ครอบคลุมถึงวิธีจัดการกับสถานการณ์การเชื่อมต่อต่างๆ ในการใช้งานของคุณอย่างเหมาะสม เมื่อจอแสดงผลหลักเชื่อมต่อและยกเลิกการเชื่อมต่อ
เฟรมเวิร์ก Android ได้รับการสร้างขึ้นสำหรับอุปกรณ์พกพา ไม่มีการรองรับในตัวสำหรับจอแสดงผลหลักที่ไม่ได้เชื่อมต่อ แต่ HAL จะต้องแทนที่จอแสดงผลหลักด้วยจอแสดงผลตัวยึดตำแหน่งในการโต้ตอบกับเฟรมเวิร์กในกรณีที่จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ
สถานการณ์ต่อไปนี้สามารถเกิดขึ้นได้ใน STB และดองเกิลทีวีที่มีจอแสดงผลที่เชื่อมต่อภายนอกซึ่งสามารถยกเลิกการเชื่อมต่อได้ หากต้องการใช้การสนับสนุนสำหรับสถานการณ์เหล่านี้ ให้ใช้ข้อมูลในตารางด้านล่าง:
สถานการณ์ | การจัดการ |
---|---|
ไม่มีจอแสดงผลที่เชื่อมต่อในขณะบูต |
|
จอแสดงผลหลักมีการเชื่อมต่อทางกายภาพ |
|
จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ |
|
ใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันสภาพการแข่งขัน
สภาพการแข่งขันอาจเกิดขึ้นได้หาก Composer HAL อัพเดตการกำหนดค่าการแสดงผลที่รองรับพร้อมกับเฟรมเวิร์กที่เรียก setActiveConfig
หรือ setActiveConfigWithConstraints
วิธีแก้ไขคือการใช้ Composer HAL เพื่อใช้รหัสตามลำดับและป้องกันปัญหานี้
ส่วนนี้จะอธิบายว่าสภาพการแข่งขันอาจเกิดขึ้นได้อย่างไร ตามด้วยรายละเอียดเกี่ยวกับวิธีการใช้งาน Composer HAL เพื่อให้ใช้ ID ตามลำดับเพื่อป้องกันเงื่อนไขดังกล่าว
พิจารณาลำดับของเหตุการณ์ต่อไปนี้ เมื่อไม่ได้กำหนด ID ลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่ ทำให้เกิดสภาวะการแข่งขัน:
ID การกำหนดค่าการแสดงผลที่รองรับคือ:
- รหัส=1 , 1080x1920 60 เฮิรตซ์
- รหัส=2 , 1080x1920 50 เฮิร์ต
กรอบงานเรียก
setActiveConfig(display, config=1)
ในขณะเดียวกัน Composer HAL จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผลและอัปเดตสถานะภายในเป็นการกำหนดค่าการแสดงผลชุดใหม่ ดังที่แสดงดังต่อไปนี้:
- รหัส=1 , 2160x3840 60 เฮิรตซ์
- รหัส=2 , 2160x3840 50 เฮิรตซ์
- รหัส=3 , 1080x1920 60 เฮิรตซ์
- รหัส=4 , 1080x1920 50 เฮิรตซ์
ผู้แต่ง HAL ส่งเหตุการณ์
onHotplug
ไปยังเฟรมเวิร์ก เพื่อแจ้งให้ทราบว่าชุดของโหมดที่รองรับมีการเปลี่ยนแปลงComposer HAL ได้รับ
setActiveConfig(display, config=1)
(จากขั้นตอนที่ 2)HAL ตีความว่าเฟรมเวิร์กได้ร้องขอการเปลี่ยนแปลงการกำหนดค่าเป็น 2160x3840 60 Hz แม้ว่าในความเป็นจริง 1080x1920 60 Hz จะเป็นที่ต้องการก็ตาม
กระบวนการที่ใช้การกำหนด ID ที่ไม่ต่อเนื่องจะสิ้นสุดที่นี่พร้อมกับการตีความการเปลี่ยนแปลงการกำหนดค่าที่ต้องการอย่างไม่ถูกต้อง
กำหนดค่า Composer HAL เพื่อใช้รหัสตามลำดับ
เพื่อหลีกเลี่ยงสภาพการแข่งขันดังกล่าว OEM ต้องใช้ Composer HAL ดังต่อไปนี้:
- เมื่อ Composer HAL อัพเดตการกำหนดค่าการแสดงผลที่รองรับ มันจะกำหนด ID ตามลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่
- เมื่อเฟรมเวิร์กเรียก
setActiveConfig
หรือsetActiveConfigWithConstraints
ด้วย ID การกำหนดค่าที่ไม่ถูกต้อง Composer HAL จะละเว้นการเรียก
ขั้นตอนเหล่านี้มีไว้เพื่อป้องกันสภาพการแข่งขันดังที่แสดงในการสนทนาต่อไปนี้
พิจารณาลำดับเหตุการณ์ต่อไปนี้ เมื่อมีการกำหนด ID ลำดับใหม่ให้กับการกำหนดค่าการแสดงผลใหม่:
ID การกำหนดค่าการแสดงผลที่รองรับคือ:
- รหัส=1 , 1080x1920 60 เฮิรตซ์
- รหัส=2 , 1080x1920 50 เฮิร์ต
กรอบงานเรียก
setActiveConfig(display, config=1)
เมื่อประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผล ชุด ID การกำหนดค่าถัดไปจะถูกกำหนดโดยเริ่มจากจำนวนเต็มที่ไม่ได้ใช้ถัดไป แสดงดังต่อไปนี้:
id=3 , 2160x3840 60 เฮิรตซ์
รหัส=4 , 2160x3840 50 เฮิรตซ์
รหัส=5 , 1080x1920 60 เฮิรตซ์
รหัส=6 , 1080x1920 50 เฮิรตซ์
Composer HAL จะส่งเหตุการณ์
onHotplug
ไปยังเฟรมเวิร์ก เพื่อแจ้งให้ทราบว่าชุดของโหมดที่รองรับมีการเปลี่ยนแปลงComposer HAL ได้รับ
setActiveConfig(display, config=1)
(จากขั้นตอนที่ 2)Composer HAL ละเว้นการโทรเนื่องจาก ID ไม่ถูกต้องอีกต่อไป
เฟรมเวิร์กรับและประมวลผลเหตุการณ์
onHotplug
จากขั้นตอนที่ 4 โดยเรียกเข้าสู่ Composer HAL โดยใช้ฟังก์ชันgetDisplayConfigs
และgetDisplayAttribute
ด้วยฟังก์ชันเหล่านี้ เฟรมเวิร์กจะระบุ ID ใหม่ (5) สำหรับความละเอียดและอัตราการรีเฟรชที่ต้องการที่ 1080x1920 และ 60 Hzเฟรมเวิร์กส่งเหตุการณ์
setActiveConfig
อื่นด้วย ID ที่อัปเดตเป็น 5Composer HAL ได้รับ
setActiveConfig(display, config=5)
จากขั้นตอนที่ 5HAL ตีความอย่างถูกต้องว่าเฟรมเวิร์กได้ร้องขอการเปลี่ยนแปลงการกำหนดค่าเป็น 1080x1920 60 Hz
ดังที่แสดงในตัวอย่างข้างต้น กระบวนการที่ใช้การกำหนด ID ตามลำดับช่วยให้แน่ใจว่าสภาวะการแข่งขันได้รับการป้องกัน และการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้องได้รับการอัปเดต