API อัตราเฟรมช่วยให้แอปแจ้งแพลตฟอร์ม Android เกี่ยวกับอัตราเฟรมที่ต้องการได้ และพร้อมใช้งานในแอปที่กำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป โดยปกติแล้ว อุปกรณ์ส่วนใหญ่จะรองรับอัตราการรีเฟรชจอแสดงผลเพียงอัตราเดียว ซึ่งมักอยู่ที่ 60Hz แต่ปัจจุบันมีการเปลี่ยนแปลงแล้ว ปัจจุบันอุปกรณ์หลายรุ่นรองรับอัตราการรีเฟรชเพิ่มเติม เช่น 90Hz หรือ 120Hz อุปกรณ์บางเครื่องรองรับการสลับอัตราการรีเฟรชที่ราบรื่น ขณะที่อุปกรณ์บางเครื่องจะแสดงหน้าจอสีดำเป็นเวลาสั้นๆ ซึ่งมักจะนาน 1 วินาที
วัตถุประสงค์หลักของ API คือการช่วยให้แอปใช้ประโยชน์จากอัตราการรีเฟรชของจอแสดงผลที่รองรับทั้งหมดได้ดียิ่งขึ้น
เช่น แอปที่เล่นวิดีโอ 24Hz
ซึ่งเรียกใช้ setFrameRate()
อาจทำให้อุปกรณ์เปลี่ยนอัตราการรีเฟรช
ของจอแสดงผลจาก 60Hz เป็น 120Hz อัตราการรีเฟรชใหม่นี้ช่วยให้เล่นวิดีโอ 24Hz ได้อย่างราบรื่นโดยไม่มีอาการสั่น
และไม่จำเป็นต้องใช้การแปลง 3:2 เหมือนที่
ต้องใช้ในการเล่นวิดีโอเดียวกันบนจอแสดงผล 60Hz ซึ่งจะช่วยให้ผู้ใช้ได้รับประสบการณ์การใช้งานที่ดีขึ้น
การใช้งานพื้นฐาน
Android มีวิธีต่างๆ ในการเข้าถึงและควบคุม Surface จึงมี setFrameRate()
API หลายเวอร์ชัน API แต่ละเวอร์ชันใช้พารามิเตอร์เดียวกันและทำงานเหมือนกับเวอร์ชันอื่นๆ ดังนี้
Surface.setFrameRate()
SurfaceControl.Transaction.setFrameRate()
ANativeWindow_setFrameRate()
ASurfaceTransaction_setFrameRate()
แอปไม่จำเป็นต้องพิจารณากรอบอัตราการรีเฟรชของจอแสดงผลที่รองรับจริง
ซึ่งรับได้โดยการเรียกใช้
Display.getSupportedModes()
เพื่อเรียกใช้ setFrameRate()
อย่างปลอดภัย เช่น แม้ว่าอุปกรณ์จะรองรับเพียง 60Hz ให้เรียกใช้ setFrameRate()
ด้วยอัตราเฟรมที่แอปต้องการ
อุปกรณ์ที่ไม่ตรงกับอัตราเฟรมของแอปได้ดีกว่าจะยังคงใช้อัตราการรีเฟรชของจอแสดงผลปัจจุบัน
หากต้องการดูว่าการเรียกใช้ setFrameRate()
ทำให้เกิดการเปลี่ยนแปลงอัตราการรีเฟรชของจอแสดงผลหรือไม่ ให้ลงทะเบียนรับการแจ้งเตือนการเปลี่ยนแปลงจอแสดงผลโดยการเรียกใช้
DisplayManager.registerDisplayListener()
หรือ AChoreographer_registerRefreshRateCallback()
เมื่อเรียกใช้ setFrameRate()
คุณควรส่งผ่านอัตราเฟรมที่แน่นอนแทนที่จะปัดเศษเป็นจำนวนเต็ม เช่น เมื่อแสดงวิดีโอที่บันทึกที่ 29.97Hz ให้ส่ง 29.97 แทนที่จะปัดเป็น 30
สำหรับแอปวิดีโอ พารามิเตอร์ความเข้ากันได้ที่ส่งไปยัง setFrameRate()
ควรตั้งค่า
เป็น Surface.FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
เพื่อให้คำแนะนำเพิ่มเติมแก่
แพลตฟอร์ม Android ว่าแอปจะใช้การดึงลงเพื่อปรับให้เข้ากับ
อัตราการรีเฟรชจอแสดงผลที่ไม่ตรงกัน (ซึ่งจะทำให้เกิดภาพสั่น)
ในบางสถานการณ์ พื้นผิววิดีโอจะหยุดส่งเฟรม แต่จะยังคง
มองเห็นได้บนหน้าจอเป็นระยะเวลาหนึ่ง สถานการณ์ทั่วไป ได้แก่ เมื่อการเล่น
สิ้นสุดวิดีโอหรือเมื่อผู้ใช้หยุดการเล่นชั่วคราว ในกรณีเหล่านี้ ให้เรียกใช้ setFrameRate()
โดยตั้งค่าพารามิเตอร์อัตราเฟรมเป็น 0 เพื่อล้างการตั้งค่าอัตราเฟรมของ Surface กลับเป็นค่าเริ่มต้น ไม่จำเป็นต้องล้างการตั้งค่าอัตราเฟรม
เช่นนี้เมื่อทำลาย Surface หรือเมื่อ Surface
ซ่อนอยู่เนื่องจากผู้ใช้เปลี่ยนไปใช้แอปอื่น ให้ล้างการตั้งค่าอัตราเฟรม
เฉพาะเมื่อ Surface ยังคงมองเห็นได้โดยไม่ได้ใช้งาน
การสลับอัตราเฟรมที่ไม่ราบรื่น
ในอุปกรณ์บางรุ่น การสลับอัตราการรีเฟรชอาจทำให้เกิดการหยุดชะงักทางภาพ เช่น หน้าจอสีดำ
เป็นเวลา 1-2 วินาที โดยปกติแล้วปัญหานี้จะเกิดขึ้นในกล่องรับสัญญาณ แผงทีวี
และอุปกรณ์ที่คล้ายกัน โดยค่าเริ่มต้น เฟรมเวิร์ก Android จะไม่เปลี่ยนโหมดเมื่อมีการเรียกใช้ API Surface.setFrameRate()
เพื่อหลีกเลี่ยงการหยุดชะงักทางภาพดังกล่าว
ผู้ใช้บางรายชอบให้มีการขัดจังหวะด้วยภาพที่ต้นและ ท้ายวิดีโอที่ยาวขึ้น ซึ่งจะช่วยให้อัตราการรีเฟรชของจอแสดงผลตรงกับอัตราเฟรมของวิดีโอ และหลีกเลี่ยงอาร์ติแฟกต์การแปลงอัตราเฟรม เช่น การกระตุกแบบ 3:2 Pulldown สำหรับการเล่นภาพยนตร์
ด้วยเหตุนี้ คุณจึงเปิดใช้การสลับอัตราการรีเฟรชที่ไม่ราบรื่นได้หากทั้ง ผู้ใช้และแอปเลือกใช้
- ผู้ใช้: หากต้องการเลือกใช้ ผู้ใช้สามารถเปิดใช้การตั้งค่าจับคู่เฟรมเรตของเนื้อหา
- แอป: หากต้องการเลือกใช้ แอปสามารถส่ง
CHANGE_FRAME_RATE_ALWAYS
ไปยังsetFrameRate()
เราขอแนะนำให้ใช้ CHANGE_FRAME_RATE_ALWAYS
สำหรับวิดีโอที่เล่นเป็นเวลานาน เช่น ภาพยนตร์ เนื่องจากประโยชน์ของการจับคู่อัตราเฟรมของวิดีโอมีมากกว่าการหยุดชะงักที่เกิดขึ้นเมื่อเปลี่ยนอัตราการรีเฟรช
คำแนะนำเพิ่มเติม
ทำตามคำแนะนำต่อไปนี้สำหรับสถานการณ์ที่พบบ่อย
หลายแพลตฟอร์ม
แพลตฟอร์ม Android ออกแบบมาเพื่อจัดการสถานการณ์ที่มีพื้นผิวหลายรายการซึ่งมีการตั้งค่าอัตราเฟรมที่แตกต่างกันได้อย่างถูกต้อง เมื่อแอปมี
Surface หลายรายการที่มีอัตราเฟรมต่างกัน ให้เรียกใช้ setFrameRate()
โดยมีอัตราเฟรมที่ถูกต้อง
สำหรับแต่ละ Surface แม้ว่าอุปกรณ์จะเรียกใช้หลายแอปพร้อมกันโดยใช้โหมดแยกหน้าจอหรือโหมดการแสดงภาพซ้อนภาพ แต่ละแอปก็สามารถเรียกใช้ setFrameRate()
สำหรับพื้นผิวของตนเองได้อย่างปลอดภัย
แพลตฟอร์มไม่เปลี่ยนเป็นอัตราเฟรมของแอป
แม้ว่าอุปกรณ์จะรองรับอัตราเฟรมที่แอประบุในการเรียกใช้
setFrameRate()
แต่ก็มีบางกรณีที่อุปกรณ์จะไม่เปลี่ยนการแสดงผลเป็นอัตราการรีเฟรชนั้น
เช่น แพลตฟอร์มที่มีลำดับความสำคัญสูงกว่าอาจมีการตั้งค่าอัตราเฟรมที่แตกต่างกัน หรืออุปกรณ์อาจอยู่ในโหมดประหยัดแบตเตอรี่ (ตั้งค่าข้อจำกัดเกี่ยวกับอัตราการรีเฟรชการแสดงผลเพื่อประหยัดแบตเตอรี่) แอปต้องยังคงทำงานได้อย่างถูกต้องเมื่ออุปกรณ์ไม่เปลี่ยนอัตราการรีเฟรชจอแสดงผลเป็นการตั้งค่าอัตราเฟรมของแอป แม้ว่าอุปกรณ์จะเปลี่ยนภายใต้สถานการณ์ปกติก็ตาม
แอปจะเป็นผู้กำหนดวิธีตอบสนองเมื่ออัตราการรีเฟรชจอแสดงผล
ไม่ตรงกับอัตราเฟรมของแอป สำหรับวิดีโอ อัตราเฟรมจะคงที่ตามอัตราเฟรมของวิดีโอต้นฉบับ และจะต้องใช้การดึงลงเพื่อแสดงเนื้อหาวิดีโอ
เกมอาจเลือกที่จะพยายามเรียกใช้ที่อัตราการรีเฟรชของจอแสดงผลแทน
การใช้อัตราเฟรมที่ต้องการ แอปไม่ควรเปลี่ยนค่าที่ส่งไปยัง setFrameRate()
ตามสิ่งที่แพลตฟอร์มทำ โดยควรตั้งค่าไว้ที่อัตราเฟรมที่แอปต้องการ ไม่ว่าแอปจะจัดการในกรณีที่แพลตฟอร์มไม่ปรับให้ตรงกับคำขอของแอปอย่างไรก็ตาม ด้วยวิธีนี้ หากเงื่อนไขของอุปกรณ์เปลี่ยนไปจนอนุญาตให้ใช้
อัตราการรีเฟรชการแสดงผลเพิ่มเติมได้ แพลตฟอร์มจะมีข้อมูลที่ถูกต้องเพื่อเปลี่ยนไปใช้อัตราเฟรมที่แอปต้องการ
ในกรณีที่แอปไม่ทำงานหรือทำงานที่อัตราการรีเฟรชของจอแสดงผลไม่ได้ แอป ควรกำหนดการประทับเวลาการนำเสนอสำหรับแต่ละเฟรม โดยใช้กลไกอย่างใดอย่างหนึ่งของแพลตฟอร์ม ในการตั้งค่าการประทับเวลาการนำเสนอ
การใช้การประทับเวลาเหล่านี้จะช่วยให้แพลตฟอร์มไม่แสดงเฟรมแอปเร็วเกินไป ซึ่งจะทำให้เกิดอาการสั่นที่ไม่จำเป็น การใช้การประทับเวลาการนำเสนอเฟรมอย่างถูกต้องอาจเป็นเรื่องที่ซับซ้อนเล็กน้อย สำหรับเกม โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการหลีกเลี่ยงการสั่นได้ที่คู่มือการเว้นระยะเฟรม และพิจารณาใช้ไลบรารีการเว้นระยะเฟรมของ Android
ในบางกรณี แพลตฟอร์มอาจเปลี่ยนไปใช้ค่าที่เป็นผลคูณของอัตราเฟรมที่แอป
ระบุไว้ใน setFrameRate()
เช่น แอปอาจเรียกใช้ setFrameRate()
ที่ 60Hz และอุปกรณ์อาจเปลี่ยนจอแสดงผลเป็น 120Hz สาเหตุหนึ่งที่อาจทำให้เกิดปัญหานี้คือแอปอื่นมี Surface ที่มีการตั้งค่าอัตราเฟรมเป็น 24Hz ใน
กรณีนี้ การแสดงผลที่ 120Hz จะช่วยให้ทั้งพื้นผิว 60Hz และ
พื้นผิว 24Hz ทำงานได้โดยไม่ต้องใช้การดึงลง
เมื่อจอแสดงผลทำงานที่อัตราเฟรมของแอปหลายรายการ แอปควรระบุการประทับเวลาการนำเสนอสำหรับแต่ละเฟรมเพื่อหลีกเลี่ยงการสั่นที่ไม่จำเป็น สำหรับเกม ไลบรารีการเว้นระยะเฟรมของ Android จะมีประโยชน์ในการตั้งค่าการประทับเวลาการนำเสนอเฟรมอย่างถูกต้อง
setFrameRate() เทียบกับ preferredDisplayModeId
WindowManager.LayoutParams.preferredDisplayModeId
เป็นอีกวิธีที่แอปสามารถระบุอัตราเฟรมต่อแพลตฟอร์ม แอปบางแอปต้องการเปลี่ยนอัตราการรีเฟรชของจอแสดงผลเท่านั้น ไม่ต้องการเปลี่ยนการตั้งค่าโหมดการแสดงผลอื่นๆ เช่น ความละเอียดของจอแสดงผล โดยทั่วไป ให้ใช้
setFrameRate()
แทน preferredDisplayModeId
ฟังก์ชัน setFrameRate()
ใช้งานง่ายกว่าเนื่องจากแอปไม่จำเป็นต้องค้นหาใน
รายการโหมดการแสดงเพื่อค้นหาโหมดที่มีอัตราเฟรมที่เฉพาะเจาะจง
setFrameRate()
ช่วยให้แพลตฟอร์มมีโอกาสมากขึ้นในการเลือกอัตราเฟรมที่เข้ากันได้
ในสถานการณ์ที่มีแพลตฟอร์มหลายรายการที่ทำงานที่
อัตราเฟรมที่แตกต่างกัน ตัวอย่างเช่น ลองพิจารณาสถานการณ์ที่แอป 2 แอป
ทำงานในโหมดแยกหน้าจอบน Pixel 4 โดยแอปหนึ่งเล่นวิดีโอ 24Hz
และอีกแอปแสดงรายการที่เลื่อนได้ให้ผู้ใช้ Pixel 4 รองรับอัตราการรีเฟรชของจอแสดงผล 2 แบบ ได้แก่ 60Hz และ 90Hz การใช้ preferredDisplayModeId
API
ระบบจะบังคับให้แพลตฟอร์มวิดีโอเลือก 60Hz หรือ 90Hz การเรียกใช้
setFrameRate()
ที่ 24Hz จะทำให้พื้นผิววิดีโอให้ข้อมูลเพิ่มเติมแก่แพลตฟอร์ม
เกี่ยวกับอัตราเฟรมของวิดีโอต้นฉบับ ซึ่งช่วยให้แพลตฟอร์ม
เลือก 90Hz สำหรับอัตราการรีเฟรชของจอแสดงผลได้ ซึ่งดีกว่า 60Hz ใน
สถานการณ์นี้
อย่างไรก็ตาม มีบางกรณีที่ควรใช้ preferredDisplayModeId
แทน setFrameRate()
เช่น กรณีต่อไปนี้
- หากแอปต้องการเปลี่ยนความละเอียดหรือการตั้งค่าโหมดการแสดงผลอื่นๆ
ให้ใช้
preferredDisplayModeId
- แพลตฟอร์มจะเปลี่ยนโหมดการแสดงผลเมื่อมีการเรียกใช้
setFrameRate()
เท่านั้น หากการเปลี่ยนโหมดมีขนาดเล็กและผู้ใช้ไม่น่าจะสังเกตเห็น หากแอปต้องการเปลี่ยนอัตราการรีเฟรชของจอแสดงผล แม้ว่าจะต้องเปลี่ยนโหมดที่ใช้ทรัพยากรมาก (เช่น ในอุปกรณ์ Android TV ) ให้ใช้preferredDisplayModeId
- แอปที่ไม่สามารถจัดการการแสดงผลที่ทำงานที่อัตราเฟรมของแอปหลายรายการ
ซึ่งต้องตั้งค่าการประทับเวลาการนำเสนอในแต่ละเฟรม ควรใช้
preferredDisplayModeId
setFrameRate() เทียบกับ preferredRefreshRate
WindowManager.LayoutParams#preferredRefreshRate
กำหนดอัตราเฟรมที่ต้องการในหน้าต่างของแอป และอัตราดังกล่าวจะมีผล
กับพื้นผิวทั้งหมดภายในหน้าต่าง แอปควรกำหนดอัตราเฟรมที่ต้องการโดยไม่คำนึงถึงอัตราการรีเฟรชที่อุปกรณ์รองรับ ซึ่งคล้ายกับ setFrameRate()
เพื่อให้ตัวจัดตารางเวลาทราบอัตราเฟรมที่แอปต้องการได้ดียิ่งขึ้น
ระบบจะไม่สนใจ preferredRefreshRate
สำหรับ Surface ที่ใช้ setFrameRate()
โดยทั่วไป ให้ใช้ setFrameRate()
หากเป็นไปได้
preferredRefreshRate เทียบกับ preferredDisplayModeId
หากแอปต้องการเปลี่ยนเฉพาะอัตราการรีเฟรชที่ต้องการ เราขอแนะนำให้ใช้
preferredRefreshRate
แทน preferredDisplayModeId
หลีกเลี่ยงการเรียกใช้ setFrameRate() บ่อยเกินไป
แม้ว่าsetFrameRate()
จะไม่ส่งผลต่อประสิทธิภาพมากนัก
แต่แอปควรหลีกเลี่ยงการเรียกใช้ setFrameRate()
ทุกเฟรมหรือหลายครั้งต่อวินาที
การเรียกใช้ setFrameRate()
มีแนวโน้มที่จะส่งผลให้เกิดการเปลี่ยนแปลง
อัตราการรีเฟรชของจอแสดงผล ซึ่งอาจส่งผลให้เฟรมหลุดระหว่างการเปลี่ยน
คุณควรหาอัตราเฟรมที่ถูกต้องล่วงหน้าและเรียกใช้
setFrameRate()
1 ครั้ง
การใช้งานสำหรับเกมหรือแอปอื่นๆ ที่ไม่ใช่แอปวิดีโอ
แม้ว่าวิดีโอจะเป็น Use Case หลักสำหรับ setFrameRate()
API แต่ก็สามารถใช้กับแอปอื่นๆ ได้
ตัวอย่างเช่น เกมที่ต้องการไม่ให้ทำงานสูงกว่า 60Hz (เพื่อลดการใช้พลังงานและเล่นได้นานขึ้น) สามารถเรียกใช้ Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT)
ได้ ด้วยวิธีนี้ อุปกรณ์ที่ทำงานที่ 90Hz โดยค่าเริ่มต้นจะทำงานที่ 60Hz แทนในขณะที่เกมทำงานอยู่ ซึ่งจะหลีกเลี่ยงการสั่นที่อาจเกิดขึ้นหากเกมทำงานที่ 60Hz ในขณะที่จอแสดงผลทำงานที่ 90Hz
การใช้ FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
มีไว้สำหรับแอปวิดีโอเท่านั้น สำหรับการใช้งานที่ไม่ใช่วิดีโอ ให้ใช้ FRAME_RATE_COMPATIBILITY_DEFAULT
การเลือกกลยุทธ์ในการเปลี่ยนอัตราเฟรม
- เราขอแนะนำเป็นอย่างยิ่งว่าเมื่อแสดงวิดีโอที่เล่นเป็นเวลานาน เช่น ภาพยนตร์ แอปควรเรียกใช้
setFrameRate(
fps, FRAME_RATE_COMPATIBILITY_FIXED_SOURCE, CHANGE_FRAME_RATE_ALWAYS)
โดยที่ fps คืออัตราเฟรมของวิดีโอ - เราขอแนะนำอย่างยิ่งไม่ให้แอปเรียกใช้
setFrameRate()
ด้วยCHANGE_FRAME_RATE_ALWAYS
เมื่อคุณคาดหวังให้การเล่นวิดีโอใช้เวลาหลายนาทีหรือน้อยกว่านั้น
ตัวอย่างการผสานรวมสำหรับแอปเล่นวิดีโอ
เราขอแนะนำให้ทำตามขั้นตอนต่อไปนี้เพื่อผสานรวมการสลับอัตรารีเฟรชในแอปเล่นวิดีโอ
- ตัดสินใจเกี่ยวกับ
changeFrameRateStrategy
:- หากเล่นวิดีโอที่มีความยาว เช่น ภาพยนตร์ ให้ใช้
MATCH_CONTENT_FRAMERATE_ALWAYS
- หากเล่นวิดีโอสั้น เช่น ตัวอย่างภาพยนตร์ ให้ใช้
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
- หากเล่นวิดีโอที่มีความยาว เช่น ภาพยนตร์ ให้ใช้
- หาก
changeFrameRateStrategy
เป็นCHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
ให้ไปที่ขั้นตอนที่ 4 - ตรวจหาว่ากำลังจะมีการสลับอัตราการรีเฟรชที่ไม่ราบรื่นโดยตรวจสอบ
ว่าข้อเท็จจริงทั้ง 2 ข้อต่อไปนี้เป็นจริง
- การสลับโหมดอย่างราบรื่นจากอัตราการรีเฟรชปัจจุบัน (สมมติว่าชื่อ C) ไปยังอัตราเฟรมของวิดีโอ (สมมติว่าชื่อ V) เป็นไปไม่ได้ กรณีนี้จะเกิดขึ้นหาก C และ V แตกต่างกันและ
Display.getMode().getAlternativeRefreshRates
ไม่มีตัวคูณของ V - ผู้ใช้เลือกใช้การเปลี่ยนแปลงอัตราการรีเฟรชที่ไม่ราบรื่น คุณตรวจหา
ได้โดยตรวจสอบว่า
DisplayManager.getMatchContentFrameRateUserPreference
แสดงผลเป็นMATCH_CONTENT_FRAMERATE_ALWAYS
หรือไม่
- การสลับโหมดอย่างราบรื่นจากอัตราการรีเฟรชปัจจุบัน (สมมติว่าชื่อ C) ไปยังอัตราเฟรมของวิดีโอ (สมมติว่าชื่อ V) เป็นไปไม่ได้ กรณีนี้จะเกิดขึ้นหาก C และ V แตกต่างกันและ
- หากต้องการเปลี่ยนไปใช้แบบไร้รอยต่อ ให้ทำดังนี้
- เรียกใช้
setFrameRate
และส่งfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
และchangeFrameRateStrategy
โดยที่fps
คืออัตราเฟรมของวิดีโอ - เริ่มเล่นวิดีโอ
- เรียกใช้
- หากกำลังจะมีการเปลี่ยนโหมดที่ไม่ราบรื่น ให้ทำดังนี้
- แสดง UX เพื่อแจ้งให้ผู้ใช้ทราบ โปรดทราบว่าเราขอแนะนำให้คุณใช้วิธีที่ ผู้ใช้สามารถปิด UX นี้และข้ามการหน่วงเวลาเพิ่มเติมในขั้นตอนที่ 5.ง. เนื่องจากความล่าช้าที่เราแนะนำนั้นมากกว่าที่จำเป็นบนจอแสดงผลที่ มีเวลาในการสลับที่เร็วกว่า
- เรียกใช้
setFrameRate
และส่งfps
,FRAME_RATE_COMPATIBILITY_FIXED_SOURCE
และCHANGE_FRAME_RATE_ALWAYS
โดยที่fps
คืออัตราเฟรมของวิดีโอ - รอการโทรกลับจาก
onDisplayChanged
- รอ 2 วินาทีเพื่อให้การสลับโหมดเสร็จสมบูรณ์
- เริ่มเล่นวิดีโอ
รหัสเทียมที่รองรับการสลับอย่างราบรื่นเท่านั้นมีดังนี้
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();
รหัสเทียมเพื่อรองรับการสลับแบบราบรื่นและไม่ราบรื่นตามที่อธิบายไว้ข้างต้นมีดังนี้
SurfaceControl.Transaction transaction = new SurfaceControl.Transaction();
if (isSeamlessSwitch(contentFrameRate)) {
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS);
transaction.apply();
beginPlayback();
} else if (displayManager.getMatchContentFrameRateUserPreference()
== MATCH_CONTENT_FRAMERATE_ALWAYS) {
showRefreshRateSwitchUI();
sleep(shortDelaySoUserSeesUi);
displayManager.registerDisplayListener(…);
transaction.setFrameRate(surfaceControl,
contentFrameRate,
FRAME_RATE_COMPATIBILITY_FIXED_SOURCE,
CHANGE_FRAME_RATE_ALWAYS);
transaction.apply();
waitForOnDisplayChanged();
sleep(twoSeconds);
hideRefreshRateSwitchUI();
beginPlayback();
}