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

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

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

การใช้งาน

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

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

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

พิจารณาตัวอย่างต่อไปนี้ซึ่งแสดงประโยชน์ของการใช้กลุ่มการกําหนดค่ากับอุปกรณ์ที่รองรับการกําหนดค่าการแสดงผล 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 และมีพารามิเตอร์ต่อไปนี้
    เวลานาโนที่ต้องการ
    เวลาใน CLOCK_MONOTONIC หลังจากที่ระยะเวลา vsync อาจ (นั่นคือระยะเวลา vsync จะต้องไม่เปลี่ยนแปลงก่อนเวลานี้) ซึ่งจะมีประโยชน์เมื่อแพลตฟอร์มต้องการวางแผนล่วงหน้าสำหรับอัตราการรีเฟรช เปลี่ยน แต่มีบัฟเฟอร์บางอย่างอยู่ในคิวที่จะแสดงแล้ว แพลตฟอร์มจะกำหนดเวลานี้ให้สอดคล้องกันเพื่อพิจารณาบัฟเฟอร์เหล่านั้นและตรวจสอบว่าการเปลี่ยนอัตราการรีเฟรชเป็นไปอย่างราบรื่นที่สุด
    จำเป็นต้องมีที่ราบรื่น
    หากเป็น "จริง" การเปลี่ยนแปลงระยะเวลา vsync จะต้องเกิดขึ้นอย่างราบรื่นโดยไม่มีภาพรบกวนให้เห็น แพลตฟอร์มจะใช้แฟล็กนี้เมื่อ จำเป็นต้องมีการเปลี่ยนแปลงอัตราการรีเฟรช เนื่องจากการเปลี่ยนแปลงเนื้อหา (ตัวอย่างเช่น ไม่มีความเคลื่อนไหวของอุปกรณ์และภาพเคลื่อนไหวจะเริ่มต้น) ซึ่งช่วยให้ผู้ให้บริการมีโอกาสที่จะไม่อนุญาตให้ทำการเปลี่ยนแปลงการกำหนดค่าบางอย่างเมื่ออาจทำให้เกิดข้อบกพร่องที่มองเห็นได้ หากเปลี่ยนการกําหนดค่าไม่ได้อย่างราบรื่นและตั้งค่า seamlessRequired เป็น true ระบบจะแสดงผล SEAMLESS_NOT_POSSIBLE เป็นรหัสผลลัพธ์และเรียกใช้การเรียกกลับ onSeamlessPossible ใหม่เมื่อเปลี่ยนการกําหนดค่าเดียวกันได้อย่างราบรื่น

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

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

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

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

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

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

เครื่องมือจัดการการแสดงผลจะทําตามขั้นตอนต่อไปนี้เพื่อกําหนดนโยบาย

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

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

SurfaceFlinger ดูแลรักษา Flag ต่อไปนี้เพื่อควบคุมวิธีกำหนดอัตราการรีเฟรช

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

Frame Rate API

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

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

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