การจัดการการเสียบร้อน

ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท HDR ที่รองรับ) อาจเปลี่ยนแปลง แบบไดนามิกในอุปกรณ์ที่มีจอแสดงผลที่เชื่อมต่อภายนอก (ด้วย HDMI หรือ DisplayPort) เช่น กล่องรับสัญญาณ (STB) ของ Android TV และอุปกรณ์การแพร่ภาพและเสียงผ่านโครงข่ายอินเทอร์เน็ต (Over The Top หรือ OTT) การเปลี่ยนแปลงนี้อาจเกิดขึ้นจากสัญญาณ Hotplug ของ HDMI เช่น เมื่อผู้ใช้เปลี่ยนจากจอแสดงผลหนึ่งไปยังอีกจอหนึ่ง หรือบูตอุปกรณ์โดยไม่มีจอแสดงผลที่เชื่อมต่อ Android 12 ขึ้นไปมีการเปลี่ยนแปลงในเฟรมเวิร์กเพื่อจัดการความสามารถในการเสียบร้อนและจอแสดงผลแบบไดนามิก

หน้านี้อธิบายการจัดการการเสียบจอแสดงผลขณะทำงานและการเปลี่ยนแปลงความสามารถของจอแสดงผลใน การติดตั้งใช้งาน HAL ของ Composer นอกจากนี้ ยังอธิบายวิธี จัดการเฟรมบัฟเฟอร์ที่เชื่อมโยงและป้องกันสภาวะการแข่งขันในสถานการณ์เหล่านี้ ด้วย

อัปเดตความสามารถในการแสดงผล

ส่วนนี้จะอธิบายวิธีที่เฟรมเวิร์ก Android จัดการการเปลี่ยนแปลงความสามารถของจอแสดงผล ที่เริ่มต้นโดย Composer HAL

ก่อนที่ Android จะจัดการการเปลี่ยนแปลงความสามารถในการแสดงผลได้อย่างถูกต้อง OEM ต้อง ใช้ Composer HAL เพื่อให้ใช้ onHotplug(display, connection=CONNECTED) เพื่อแจ้งให้เฟรมเวิร์กทราบถึง การเปลี่ยนแปลงความสามารถในการแสดงผล หลังจากที่ใช้การเปลี่ยนแปลงนี้แล้ว Android จะจัดการ การเปลี่ยนแปลงความสามารถของจอแสดงผลดังนี้

  1. เมื่อตรวจพบการเปลี่ยนแปลงความสามารถในการแสดงผล เฟรมเวิร์กจะได้รับการแจ้งเตือน onHotplug(display, connection=CONNECTED)
  2. เมื่อได้รับการแจ้งเตือน เฟรมเวิร์กจะทิ้งสถานะการแสดงผลและสร้างสถานะใหม่ด้วยความสามารถใหม่จาก HAL โดยใช้วิธี getActiveConfig, getDisplayConfigs, getDisplayAttribute, getColorModes, getHdrCapabilities และ getDisplayCapabilities
  3. หลังจากที่เฟรมเวิร์กสร้างสถานะการแสดงผลใหม่แล้ว เฟรมเวิร์กจะส่ง Callback onDisplayChanged ไปยังแอปที่รอรับฟังเหตุการณ์ดังกล่าว

เฟรมเวิร์กจะจัดสรรเฟรมบัฟเฟอร์ใหม่ในเหตุการณ์ onHotplug(display, connection=CONNECTED)ที่ตามมา ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการหน่วยความจำของ Framebuffer อย่างถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาดระหว่างการจัดสรร Framebuffer ใหม่ได้ที่ การจัดการ Framebuffer ของไคลเอ็นต์

จัดการสถานการณ์การเชื่อมต่อที่พบบ่อย

ส่วนนี้จะครอบคลุมวิธีจัดการสถานการณ์การเชื่อมต่อต่างๆ อย่างเหมาะสมในการติดตั้งใช้งานเมื่อเชื่อมต่อและยกเลิกการเชื่อมต่อจอแสดงผลหลัก

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

สถานการณ์ต่อไปนี้อาจเกิดขึ้นใน STB และดองเกิลทีวีที่มี จอแสดงผลที่เชื่อมต่อภายนอกซึ่งสามารถยกเลิกการเชื่อมต่อได้ หากต้องการใช้ การรองรับสถานการณ์เหล่านี้ ให้ใช้ข้อมูลในตารางต่อไปนี้

สถานการณ์ การใช้งาน
ไม่มีจอแสดงผลที่เชื่อมต่อในเวลาที่บูต
  • ส่งonHotplug(display, connection=CONNECTED) สัญญาณจาก HAL ของ Composer ไปยังเฟรมเวิร์ก
  • แทนที่สถานะการแสดงผลจริงภายใน Composer HAL ด้วยสถานะการแสดงผลตัวยึดตำแหน่ง
จอแสดงผลหลักเชื่อมต่ออยู่
  • ส่งonHotplug(display, connection=CONNECTED) เหตุการณ์อื่นจาก Composer HAL ไปยังเฟรมเวิร์ก

    ซึ่งจะทำให้เฟรมเวิร์กโหลดความสามารถในการแสดงผลทั้งหมดซ้ำ

จอแสดงผลหลักถูกตัดการเชื่อมต่อทางกายภาพ
  • ส่งonHotplug(display, connection=CONNECTED) เหตุการณ์อื่นจาก Composer HAL ไปยังเฟรมเวิร์ก
  • แทนที่สถานะการแสดงผลจริงภายใน Composer HAL ด้วยสถานะการแสดงผลตัวยึดตำแหน่ง จอแสดงผลตัวยึดตําแหน่งต้องมีโหมดการแสดงผลเดียว เพื่อให้เฟรมเวิร์กส่งการเรียกกลับ onDisplayChanged ไปยังแอป (เนื่องจากชุดโหมดที่รองรับมีการเปลี่ยนแปลง) โหมดการแสดงผลเดียวนี้ต้องตรงกับโหมดที่ใช้งานล่าสุด ของจอแสดงผลจริงก่อนที่จะยกเลิกการเชื่อมต่อ เพื่อไม่ให้แอปได้รับเหตุการณ์การเปลี่ยนแปลงการกำหนดค่า

ข้อควรพิจารณาเกี่ยวกับการเชื่อมต่อที่ไม่ใช่ HDMI

Android TV รองรับความละเอียดต่อไปนี้เท่านั้น

  • 720x1280
  • 1080x1920
  • 2160x3840
  • 4320x7680

เมื่อ STB หรือดองเกิลทีวีพยายามแสดงความละเอียดที่ไม่รองรับ เช่น 480i ผ่านการเชื่อมต่อ CVBS ระบบจะแสดงข้อความแสดงข้อผิดพลาดต่อผู้ใช้

หาก STB หรือดองเกิลทีวีมีการเชื่อมต่อทั้ง HDMI และที่ไม่ใช่ HDMI การเชื่อมต่อ HDMI จะเป็นจอแสดงผลหลัก และการเชื่อมต่อที่ไม่ใช่ HDMI จะ ไม่ทำงาน ด้วยเหตุนี้ หากการเชื่อมต่อ HDMI ถูกยกเลิกในขณะที่การเชื่อมต่อที่ไม่ใช่ HDMI ยังคงเชื่อมต่ออยู่ ระบบจะส่งเหตุการณ์ไปยัง SurfaceFlinger และต้องแสดงความสามารถของจอแสดงผลที่ไม่ใช่ HDMI ผ่าน getDisplayAttribute และ API อื่นๆ ของ IComposerClient (เช่น getHdrCapabilities)

ใช้รหัสการกำหนดค่าตามลำดับเพื่อป้องกันสภาวะการแข่งขัน

เงื่อนไขการแข่งขันอาจเกิดขึ้นหาก Composer HAL อัปเดตการกำหนดค่าจอแสดงผลที่รองรับ พร้อมกันกับเฟรมเวิร์กที่เรียก setActiveConfig หรือ setActiveConfigWithConstraints วิธีแก้ปัญหาคือการใช้ Composer HAL เพื่อใช้รหัสตามลำดับและป้องกันปัญหานี้

ส่วนนี้จะอธิบายวิธีที่สภาวะการแข่งขันอาจเกิดขึ้น ตามด้วยรายละเอียด เกี่ยวกับวิธีติดตั้งใช้งาน Composer HAL เพื่อให้ใช้รหัสตามลำดับเพื่อป้องกันสภาวะดังกล่าว

พิจารณาลำดับเหตุการณ์ต่อไปนี้เมื่อไม่ได้กำหนดรหัสใหม่ตามลำดับ ให้กับการกำหนดค่าการแสดงผลใหม่ ซึ่งทำให้เกิดสภาวะการแข่งขัน

  1. รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. เฟรมเวิร์กจะเรียกใช้ setActiveConfig(display, config=1)

  3. ในขณะเดียวกัน Composer HAL จะประมวลผลการเปลี่ยนแปลงการกำหนดค่าจอแสดงผลและ อัปเดตสถานะภายในเป็นการกำหนดค่าจอแสดงผลชุดใหม่ ดังนี้

    • id=1, 2160x3840 60 Hz
    • id=2, 2160x3840 50 Hz
    • id=3, 1080x1920 60 Hz
    • id=4, 1080x1920 50 Hz
  4. Composer HAL จะส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์กเพื่อแจ้งให้ทราบว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลง

  5. HAL ของ Composer จะได้รับ setActiveConfig(display, config=1) (จาก ขั้นตอนที่ 2)

  6. HAL ตีความว่าเฟรมเวิร์กได้ขอเปลี่ยนการกำหนดค่าเป็น 2160x3840 60 Hz แต่ในความเป็นจริงแล้วมีการเลือก 1080x1920 60 Hz

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

กำหนดค่า HAL ของ Composer ให้ใช้รหัสตามลำดับ

หากต้องการหลีกเลี่ยงภาวะแข่งขันดังกล่าว OEM ต้องใช้ Composer HAL ดังนี้

  • เมื่อ Composer HAL อัปเดตการกำหนดค่าการแสดงผลที่รองรับ ระบบจะกำหนดรหัสใหม่ที่ต่อเนื่อง ให้กับการกำหนดค่าการแสดงผลใหม่
  • เมื่อเฟรมเวิร์กเรียก setActiveConfig หรือ setActiveConfigWithConstraints ด้วยรหัสการกำหนดค่าที่ไม่ถูกต้อง Composer HAL จะไม่สนใจการเรียก

ขั้นตอนเหล่านี้มีไว้เพื่อป้องกันสภาวะการแข่งขันตามที่แสดงในการสนทนาต่อไปนี้

พิจารณาลำดับเหตุการณ์ต่อไปนี้เมื่อมีการกำหนดรหัสใหม่ตามลำดับ ให้กับการกำหนดค่าการแสดงผลใหม่

  1. รหัสการกำหนดค่าการแสดงผลที่รองรับมีดังนี้

    • id=1, 1080x1920 60 Hz
    • id=2, 1080x1920 50 Hz
  2. เฟรมเวิร์กจะเรียกใช้ setActiveConfig(display, config=1)

  3. เมื่อประมวลผลการเปลี่ยนแปลงการกำหนดค่าการแสดงผล ระบบจะกำหนดชุดรหัสการกำหนดค่าถัดไป โดยเริ่มจากจำนวนเต็มที่ไม่ได้ใช้ถัดไป ดังนี้

    • id=3, 2160x3840 60 Hz

    • id=4, 2160x3840 50 Hz

    • id=5, 1080x1920 60 Hz

    • id=6, 1080x1920 50 Hz

  4. Composer HAL จะส่งเหตุการณ์ onHotplug ไปยังเฟรมเวิร์กเพื่อแจ้งให้ทราบว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลง

  5. HAL ของ Composer จะได้รับ setActiveConfig(display, config=1) (จาก ขั้นตอนที่ 2)

  6. HAL ของ Composer จะไม่สนใจการเรียกเนื่องจากรหัสใช้ไม่ได้อีกต่อไป

  7. เฟรมเวิร์กจะรับและประมวลผลเหตุการณ์ onHotplug จากขั้นตอนที่ 4 โดยจะเรียกใช้ HAL ของ Composer โดยใช้ฟังก์ชัน getDisplayConfigs และ getDisplayAttribute ฟังก์ชันเหล่านี้ช่วยให้เฟรมเวิร์กระบุ รหัสใหม่ (5) สำหรับความละเอียดและอัตรารีเฟรชที่เลือกเป็น 1080x1920 และ 60 Hz

  8. เฟรมเวิร์กจะส่งเหตุการณ์ setActiveConfig อีกรายการพร้อมรหัสที่อัปเดตแล้ว เป็น 5

  9. HAL ของ Composer จะได้รับ setActiveConfig(display, config=5) จาก ขั้นตอนที่ 5

  10. HAL ตีความอย่างถูกต้องว่าเฟรมเวิร์กได้ขอเปลี่ยนการกำหนดค่าเป็น 1080x1920 60 Hz

ดังที่แสดงในตัวอย่างก่อนหน้า กระบวนการที่ใช้การกำหนดรหัสตามลำดับ จะยืนยันว่าระบบป้องกันไม่ให้เกิด Race Condition และอัปเดตการเปลี่ยนแปลงการกำหนดค่าการแสดงผลที่ถูกต้อง