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

ความสามารถในการแสดงผล (เช่น โหมดการแสดงผลและประเภท 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 ด้วยรหัสการกำหนดค่าที่ไม่ถูกต้อง HAL ของ Composer จะไม่สนใจการเรียกใช้

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

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

  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 event ไปยังเฟรมเวิร์กเพื่อแจ้งให้ทราบว่าชุดโหมดที่รองรับมีการเปลี่ยนแปลง

  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

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