อัตราการรีเฟรชหลายรายการ

Android 11 เพิ่มการรองรับอุปกรณ์ที่มีอัตราการรีเฟรชหลายอัตรา ฟีเจอร์นี้มีองค์ประกอบหลัก 3 อย่างดังนี้

  • API ของ HAL ใหม่ที่เปิดตัวใน android.hardware.graphics.composer@2.4
  • โค้ดแพลตฟอร์มเพื่อแยกวิเคราะห์การกำหนดค่าอุปกรณ์สำหรับอัตราการรีเฟรชต่างๆ และ ตั้งค่าอัตราการรีเฟรชที่ต้องการ
  • API ใหม่ของ SDK และ NDK เพื่อให้แอปตั้งค่าอัตราเฟรมที่ต้องการได้

การใช้งาน

เราได้เพิ่มการรองรับการสลับอัตราการรีเฟรชโดยเฉพาะใน android.hardware.graphics.composer@2.4 HAL เราขอแนะนำให้ใช้เวอร์ชันนี้เนื่องจาก HAL ของ Composer เวอร์ชันก่อนหน้า รองรับการสลับอัตราการรีเฟรชได้จำกัด

กลุ่มการกำหนดค่า

มีการเพิ่มแอตทริบิวต์ใหม่ CONFIG_GROUP ลงใน IComposerClient::Attribute ซึ่งสามารถค้นหาได้โดยใช้ getDisplayAttribute_2_4 API แอตทริบิวต์นี้ช่วยให้ผู้ให้บริการจัดกลุ่ม การกำหนดค่าการแสดงผลเข้าด้วยกันได้ การกำหนดค่าในกลุ่มเดียวกันช่วยให้สลับระหว่างการกำหนดค่าได้อย่างราบรื่นในกรณีส่วนใหญ่ แพลตฟอร์มใช้กลุ่มการกำหนดค่าเพื่อแยกความแตกต่างของการกำหนดค่าที่สามารถสลับระหว่างกันได้ เพื่อสลับอัตราการรีเฟรชและไม่ใช่แอตทริบิวต์อื่นๆ สำหรับการกำหนดค่า

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

  • 1080p@60Hz
  • 1080p@90Hz
  • 1080i@72Hz
  • 1080i@48Hz

แม้ว่าอุปกรณ์จะรองรับอัตรารีเฟรช 48Hz, 60Hz, 72Hz และ 90Hz แต่ จอแสดงผลจะทำงานในโหมดอื่น และการเปลี่ยนจาก 60Hz เป็น 72Hz จะเปลี่ยน การกำหนดค่าจอแสดงผลจาก 1080p เป็น 1080i ซึ่งอาจไม่ใช่ลักษณะการทำงานที่ต้องการ ซึ่งแก้ไขได้โดยใช้กลุ่มการกำหนดค่า โดยการจัดกลุ่ม 60Hz และ 90Hz ไว้ด้วยกันในกลุ่มการกำหนดค่าเดียว และจัดกลุ่ม 48Hz และ 72Hz ไว้ในกลุ่มการกำหนดค่าอีกกลุ่มหนึ่ง แพลตฟอร์มทราบว่า สามารถสลับระหว่าง 60Hz กับ 90Hz และระหว่าง 48Hz กับ 72Hz ได้ แต่ไม่สามารถสลับระหว่าง 60Hz กับ 72Hz เนื่องจากจะส่งผลให้เกิดการเปลี่ยนแปลงการกำหนดค่าแทนที่จะเป็นการเปลี่ยน อัตราการรีเฟรชเพียงอย่างเดียว

การอัปเดต Composer API

getDisplayVsyncPeriod
เพิ่ม getDisplayVsyncPeriod เพื่อให้ควบคุมและคาดการณ์ได้ดียิ่งขึ้นเมื่อเปลี่ยนอัตราการรีเฟรช getDisplayVsyncPeriod จะแสดงอัตราการรีเฟรชปัจจุบัน (ในแง่ของ ช่วงเวลา Vsync) ที่จอแสดงผลทำงาน ซึ่งจะเป็นประโยชน์อย่างยิ่งในขณะที่ แพลตฟอร์มต้องการเปลี่ยนระหว่างอัตราการรีเฟรชและอัตราการรีเฟรชปัจจุบัน เพื่อตัดสินใจว่าจะเริ่มเฟรมถัดไปเมื่อใด
setActiveConfigWithConstraints
setActiveConfigWithConstraints เมธอดเป็นส่วนขยายใหม่ ของเมธอด setActiveConfig ที่มีอยู่ และให้ข้อมูลเพิ่มเติม เกี่ยวกับการเปลี่ยนแปลงการกำหนดค่า ข้อจํากัดจะระบุเป็นส่วนหนึ่งของพารามิเตอร์ vsyncPeriodChangeConstraints และมีพารามิเตอร์ต่อไปนี้
    desiredTimeNanos
    เวลาใน CLOCK_MONOTONIC หลังจากที่ระยะเวลา Vsync อาจเปลี่ยนแปลง (กล่าวคือ ระยะเวลา Vsync ต้องไม่เปลี่ยนแปลงก่อนเวลานี้) ซึ่งจะมีประโยชน์เมื่อแพลตฟอร์มต้องการวางแผนล่วงหน้าสำหรับการเปลี่ยนแปลงอัตราการรีเฟรช แต่มีบัฟเฟอร์บางส่วนอยู่ในคิวที่จะนำเสนออยู่แล้ว แพลตฟอร์ม จะตั้งเวลานี้ตามนั้นเพื่อพิจารณาบัฟเฟอร์เหล่านั้นและตรวจสอบว่า การเปลี่ยนอัตราการรีเฟรชจะราบรื่นที่สุดเท่าที่จะเป็นไปได้
    seamlessRequired
    หากเป็นจริง การเปลี่ยนแปลงระยะเวลา Vsync ต้องเกิดขึ้นอย่างราบรื่น โดยไม่มีอาร์ติแฟกต์ภาพที่สังเกตเห็นได้ แพลตฟอร์มจะใช้ Flag นี้เมื่อต้อง เปลี่ยนอัตราการรีเฟรชอันเป็นผลมาจากการเปลี่ยนแปลงเนื้อหา (เช่น อุปกรณ์ไม่ได้ใช้งานและเริ่มภาพเคลื่อนไหว) ซึ่งจะช่วยให้ผู้ให้บริการมีโอกาส ไม่อนุญาตให้เปลี่ยนแปลงการกำหนดค่าบางอย่างเมื่ออาจส่งผลให้เกิด อาร์ติแฟกต์ภาพที่สังเกตเห็นได้ชัด หากเปลี่ยนการกำหนดค่าอย่างราบรื่นไม่ได้และ ตั้งค่า seamlessRequired เป็น true การติดตั้งใช้งาน คาดว่าจะแสดง SEAMLESS_NOT_POSSIBLE เป็นรหัสการคืนค่า และ เรียกใช้แฮนเดิลการเรียกกลับ onSeamlessPossible ใหม่เมื่อเปลี่ยนการกำหนดค่าเดียวกัน ได้อย่างราบรื่น

เมื่อการติดตั้งใช้งานสำเร็จ ระบบจะแสดงผล VsyncPeriodChangeTimeline ซึ่งจะบอกแพลตฟอร์มว่าเมื่อใดที่ควรคาดหวัง ให้เกิดการเปลี่ยนแปลงอัตราการรีเฟรช newVsyncAppliedTimeNanos ต้องตั้งค่าพารามิเตอร์เป็นเวลาใน CLOCK_MONOTONIC เมื่อ จอแสดงผลใหม่จะเริ่มรีเฟรชที่ช่วงเวลา Vsync ใหม่ ซึ่งเมื่อใช้ร่วมกับ desiredTimeNanos จะช่วยให้แพลตฟอร์มวางแผนการสลับอัตราการรีเฟรชล่วงหน้า และเริ่มทำเครื่องหมายแอปสำหรับอัตราการรีเฟรชใหม่ล่วงหน้าได้ ซึ่งจะช่วยให้การเปลี่ยนอัตราการรีเฟรชเป็นไปอย่างราบรื่น

การติดตั้งใช้งานบางอย่างกำหนดให้ต้องส่งเฟรมรีเฟรชก่อนจึงจะส่งอัตราการรีเฟรชได้ ด้วยเหตุนี้ HAL จึงมีrefreshRequired พารามิเตอร์เพื่อระบุว่าจำเป็นต้องมีเฟรมรีเฟรช และ refreshTimeNanosเพื่อระบุ Vsync แรกที่ต้องส่งเฟรมรีเฟรช หลังจากนั้น

onVsyncPeriodTimingChanged [callback]
การเรียกกลับใหม่ที่ HAL เรียกได้เพื่อระบุให้แพลตฟอร์มทราบว่าพารามิเตอร์บางอย่างของไทม์ไลน์มีการเปลี่ยนแปลง และแพลตฟอร์มต้องปรับไทม์ไลน์ ระบบคาดว่าจะเรียกใช้การเรียกกลับนี้หากด้วยเหตุผลบางประการ ไทม์ไลน์เก่า พลาดไปเนื่องจาก HAL ใช้เวลาประมวลผลนานหรือเฟรมรีเฟรชล่าช้า

แพลตฟอร์มตัดสินใจเปลี่ยนอัตราการรีเฟรชอย่างไร

การเลือกอัตราการรีเฟรชจะเกิดขึ้นในบริการของระบบ 2 รายการต่อไปนี้

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

Display Manager จะทำตามขั้นตอนต่อไปนี้เพื่อกำหนด นโยบาย

  • ค้นหารหัสการกำหนดค่าเริ่มต้นโดยการค้นหาการกำหนดค่าที่ใช้งานอยู่จาก SurfaceFlinger
  • จำกัดช่วงของค่าต่ำสุดและสูงสุดโดยการวนซ้ำตาม เงื่อนไขของระบบ
    • การตั้งค่าอัตราการรีเฟรชเริ่มต้น: ค่าอัตราการรีเฟรชเริ่มต้น จะตั้งค่าในR.integer.config_defaultRefreshRateการวางซ้อนการกำหนดค่า ค่านี้ใช้เพื่อกำหนดอัตรารีเฟรชอุปกรณ์มาตรฐานสำหรับภาพเคลื่อนไหว และการโต้ตอบแบบสัมผัส
    • การตั้งค่าอัตราการรีเฟรชสูงสุด: ระบบจะอ่านค่าอัตราการรีเฟรชสูงสุด จาก Settings.System.PEAK_REFRESH_RATE ค่านี้จะ เปลี่ยนในรันไทม์เพื่อให้สอดคล้องกับการตั้งค่าอุปกรณ์ปัจจุบัน (เช่น จากเมนู ตัวเลือก) ค่าเริ่มต้นจะตั้งค่าไว้ใน R.integer.config_defaultPeakRefreshRate การวางซ้อนการกำหนดค่า
    • การตั้งค่าอัตราการรีเฟรชขั้นต่ำ: ระบบจะอ่านค่าอัตราการรีเฟรชขั้นต่ำ จาก Settings.System.MIN_REFRESH_RATE ค่านี้สามารถ เปลี่ยนแปลงได้ในรันไทม์เพื่อให้สอดคล้องกับการตั้งค่าอุปกรณ์ปัจจุบัน (เช่น จากตัวเลือกเมนู) ค่าเริ่มต้นคือ 0 จึงไม่มีค่าต่ำสุดเริ่มต้น
    • ModeId ที่แอปพลิเคชันขอ: แอปสามารถตั้งค่า WindowManager.LayoutParams.preferredDisplayModeId เพื่อแสดงการกำหนดค่าที่ต้องการซึ่งจอแสดงผลควรทำงาน ในกรณีส่วนใหญ่ DisplayManager จะตั้งค่ารหัสการกำหนดค่าเริ่มต้น ตามนั้น และตั้งค่าอัตราการรีเฟรชขั้นต่ำและสูงสุดให้ตรงกับอัตราการรีเฟรชของการกำหนดค่า
    • โหมดประหยัดแบตเตอรี่: ระบบจะจำกัดอัตราการรีเฟรชไว้ที่ 60Hz หรือต่ำกว่า เมื่ออุปกรณ์อยู่ในโหมดประหยัดพลังงาน ซึ่งจะระบุผ่าน Settings.Global.LOW_POWER_MODE.

เมื่อ DisplayManager ตั้งค่านโยบายแล้ว SurfaceFlinger จะตั้งค่าอัตราการรีเฟรชตามเลเยอร์ที่ใช้งานอยู่ (เลเยอร์ที่จัดคิว การอัปเดตเฟรม) หากเจ้าของเลเยอร์ตั้งค่าอัตราเฟรม SurfaceFlinger จะพยายามตั้งค่าอัตราการรีเฟรชให้เป็นตัวคูณของอัตรานั้น เช่น หากเลเยอร์ที่ใช้งานอยู่ 2 เลเยอร์ตั้งค่าอัตราเฟรมเป็น 24 และ 60 SurfaceFlinger จะเลือก 120Hz หากมี หาก SurfaceFlinger ไม่สามารถใช้อัตรารีเฟรชดังกล่าวได้ ระบบจะพยายามเลือกอัตรารีเฟรชที่มี ข้อผิดพลาดน้อยที่สุดสำหรับอัตราเฟรม ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ที่ developer.android.com

SurfaceFlinger มีการรักษาค่าสถานะต่อไปนี้เพื่อ ควบคุมวิธีตัดสินใจเกี่ยวกับอัตราการรีเฟรช

  • ro.surface_flinger.use_content_detection_for_refresh_rate: หาก ตั้งค่าอัตราการรีเฟรช ระบบจะกำหนดอัตราการรีเฟรชตาม เลเยอร์ที่ใช้งานอยู่ แม้ว่าจะไม่ได้ตั้งค่าอัตราเฟรมไว้ก็ตาม SurfaceFlinger มี ฮิวริสติกที่ใช้หาค่า FPS เฉลี่ยที่เลเยอร์โพสต์บัฟเฟอร์โดย ดูการประทับเวลาการนำเสนอที่แนบมากับบัฟเฟอร์
  • ro.surface_flinger.set_touch_timer_ms: หาก > 0 ระบบจะใช้ค่าเริ่มต้น อัตราการรีเฟรชเมื่อผู้ใช้แตะหน้าจอตามระยะหมดเวลาที่กำหนดค่า ฮิวริสติกนี้ดำเนินการเพื่อให้พร้อมกับอัตราการรีเฟรชเริ่มต้นสำหรับ ภาพเคลื่อนไหว
  • ro.surface_flinger.set_idle_timer_ms: หาก > 0 ระบบจะใช้ค่าอัตราการรีเฟรชขั้นต่ำ เมื่อไม่มีการอัปเดตหน้าจอตามระยะหมดเวลาที่กำหนดค่าไว้
  • ro.surface_flinger.set_display_power_timer_ms: หาก > 0 ระบบจะใช้ อัตราการรีเฟรชเริ่มต้นเมื่อเปิดจอแสดงผล (หรือเมื่อออกจาก AOD) สำหรับการหมดเวลาที่กำหนดค่าไว้

Frame Rate API

API อัตราเฟรมช่วยให้แอปแจ้งแพลตฟอร์ม Android เกี่ยวกับอัตราเฟรมที่ต้องการได้ และพร้อมใช้งานในแอปที่กำหนดเป้าหมายเป็น Android 11 ดูข้อมูลเพิ่มเติมเกี่ยวกับ API อัตราเฟรมได้ในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ที่ developer.android.com

ตัวเลือกสำหรับนักพัฒนาแอป

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