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

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

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

การใช้งาน

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

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

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

พิจารณาตัวอย่างต่อไปนี้ที่แสดงให้เห็นถึงสิทธิประโยชน์ของการใช้กลุ่มการกำหนดค่ากับอุปกรณ์ที่รองรับการกำหนดค่าการแสดงผล 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 ของ Composer นอกจากนี้ ยังกำหนดช่วงค่าต่ำสุดและสูงสุด เพื่อให้ 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

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

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