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