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

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

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

การนำไปปฏิบัติ

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

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

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

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

  • 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 ได้ เนื่องจากจะส่งผลให้เกิดการเปลี่ยนแปลงการกำหนดค่าแทนที่จะเปลี่ยนอัตรารีเฟรชเพียงอย่างเดียว

การอัปเดต API ของผู้แต่ง

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

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

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

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

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

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

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

ตัวจัดการการแสดงผลดำเนินการตามขั้นตอนต่อไปนี้เพื่อกำหนดนโยบาย:

  • ค้นหา ID การกำหนดค่าเริ่มต้นโดยการสอบถามการกำหนดค่าที่ใช้งานอยู่จาก 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 จะตั้งค่า ID การกำหนดค่าเริ่มต้นตามนั้น และตั้งค่าอัตราการรีเฟรชขั้นต่ำและสูงสุดเพื่อให้ตรงกับอัตราการรีเฟรชของการกำหนดค่า
    • ประหยัดแบตเตอรี่ : อัตราการรีเฟรชถูกจำกัดไว้ที่ 60Hz หรือต่ำกว่า เมื่ออุปกรณ์อยู่ในโหมดพลังงานต่ำ ซึ่งระบุผ่าน Settings.Global.LOW_POWER_MODE.

เมื่อ DisplayManager ตั้งค่านโยบาย SurfaceFlinger จะตั้งค่าอัตราการรีเฟรชตามเลเยอร์ที่ใช้งานอยู่ (เลเยอร์ที่เฟรมคิวอัปเดต) หากเจ้าของเลเยอร์ตั้ง ค่าอัตรา เฟรม SurfaceFlinger จะพยายามตั้งค่าอัตราการรีเฟรชเป็นสิ่งที่เป็นตัวคูณของอัตรานั้น ตัวอย่างเช่น หากเลเยอร์ที่ใช้งานอยู่สองชั้นตั้งค่าอัตราเฟรมเป็น 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) สำหรับการหมดเวลาที่กำหนดไว้

API อัตราเฟรม

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

ตัวเลือกนักพัฒนา

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