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 ได้ เนื่องจากจะส่งผลให้เกิดการเปลี่ยนแปลงการกำหนดค่าแทนที่จะเปลี่ยนอัตรารีเฟรชเพียงอย่างเดียว
![](https://source.android.google.cn/static/docs/core/graphics/images/multiple-refresh-rate-green.gif?authuser=6&hl=th)
![](https://source.android.google.cn/static/docs/core/graphics/images/multiple-refresh-rate-blue.gif?authuser=6&hl=th)
การอัปเดต 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
ตัวเลือกนักพัฒนา
![](https://source.android.google.cn/static/docs/core/graphics/images/multiple-refresh-rate-toggle.gif?authuser=6&hl=th)
มีการเพิ่มตัวเลือกใหม่สำหรับนักพัฒนาซอฟต์แวร์ลงในเมนูที่สลับการซ้อนทับบนหน้าจอด้วยอัตราการรีเฟรชปัจจุบัน ตัวเลือกใหม่อยู่ภายใต้ การตั้งค่า > ระบบ > ตัวเลือกนักพัฒนา > แสดงอัตราการรีเฟรช