อัตราเฟรม

API อัตราเฟรมช่วยให้แอปแจ้งให้แพลตฟอร์ม Android ทราบถึงเฟรมที่ต้องการได้ และใช้ได้ในแอปที่กำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) ขึ้นไป ก่อนหน้านี้อุปกรณ์ส่วนใหญ่รองรับอัตราการรีเฟรชจอแสดงผลเพียง 1 หน้าจอ มักเป็น 60Hz แต่ข้อมูลนี้ได้เปลี่ยนแปลงไปแล้ว มีอุปกรณ์จำนวนมากรองรับการใช้งานเพิ่มเติม อัตราการรีเฟรช เช่น 90Hz หรือ 120Hz อุปกรณ์บางรุ่นรองรับอัตราการรีเฟรชอย่างราบรื่น ขณะที่ตัวอื่นๆ แสดงหน้าจอสีดำเป็นเวลาสั้นๆ ซึ่งโดยปกติจะใช้เวลา 1 วินาที

วัตถุประสงค์หลักของ API คือการช่วยให้แอปได้รับประโยชน์จาก อัตราการรีเฟรชจอแสดงผลที่รองรับ เช่น แอปที่เล่นวิดีโอ 24Hz ที่โทรหา setFrameRate() อาจส่งผลให้อุปกรณ์เปลี่ยนจอแสดงผล อัตราการรีเฟรชจาก 60Hz ถึง 120Hz อัตราการรีเฟรชใหม่นี้จะทำให้ เล่นวิดีโอ 24 Hz แบบไม่มีที่อื่น ไม่จำเป็นต้องดึงลง 3:2 อย่างที่ควรจะเป็น ที่จำเป็นต่อการเล่นวิดีโอเดียวกันบนจอแสดงผล 60 Hz วิธีนี้ส่งผลให้ผู้ใช้ ประสบการณ์การใช้งาน

การใช้งานพื้นฐาน

Android นำเสนอวิธีต่างๆ ในการเข้าถึงและควบคุมแพลตฟอร์ม setFrameRate() API หลายเวอร์ชัน โดย API แต่ละเวอร์ชันจะมี พารามิเตอร์เดียวกันและทำงานเหมือนกับพารามิเตอร์อื่นๆ

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

การเปลี่ยนอัตราเฟรมที่ไม่ราบรื่น

ในอุปกรณ์บางรุ่น การสลับอัตราการรีเฟรชอาจมีการหยุดชะงักทางสายตา เช่น สีดำ เป็นเวลา 1-2 วินาที ปัญหานี้มักเกิดใน Set-top box แผงทีวี และอุปกรณ์ที่คล้ายกัน เฟรมเวิร์ก Android จะไม่เปลี่ยนโหมดโดยค่าเริ่มต้น เมื่อ Surface.setFrameRate() มีการเรียก API เพื่อหลีกเลี่ยงการหยุดชะงักของภาพดังกล่าว

ผู้ใช้บางรายชอบภาพแทรกในช่วงเริ่มต้น ในช่วงท้ายของวิดีโอที่ยาวกว่า ซึ่งจะทำให้อัตราการรีเฟรชของจอแสดงผลตรงกัน อัตราเฟรมของวิดีโอ และหลีกเลี่ยงอาร์ติแฟกต์การแปลงอัตราเฟรม เช่น 3:2 แถบเลื่อนสำหรับเล่นภาพยนตร์

ด้วยเหตุนี้ สวิตช์อัตราการรีเฟรชที่ราบรื่นสามารถเปิดใช้งานได้ในกรณีที่ทั้ง การเลือกให้ผู้ใช้และแอป:

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

คำแนะนำเพิ่มเติม

ทำตามคำแนะนำต่อไปนี้เพื่อดูสถานการณ์ที่พบบ่อย

หลายพื้นผิว

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

แพลตฟอร์มไม่เปลี่ยนเป็นอัตราเฟรมของแอป

แม้ว่าอุปกรณ์จะรองรับอัตราเฟรมที่แอประบุไว้ในการเรียก setFrameRate() มีบางกรณีที่อุปกรณ์ไม่เปลี่ยนจอแสดงผลเป็น อัตราการรีเฟรชนั้น ตัวอย่างเช่น แพลตฟอร์มที่มีลำดับความสำคัญสูงกว่าอาจมี การตั้งค่าอัตราเฟรม หรืออุปกรณ์อาจอยู่ในโหมดประหยัดแบตเตอรี่ (การตั้งค่า การจำกัดอัตราการรีเฟรชจอแสดงผลเพื่อประหยัดแบตเตอรี่) แอปต้องยังคง จะทำงานได้อย่างถูกต้องเมื่ออุปกรณ์ไม่เปลี่ยนอัตราการรีเฟรชจอแสดงผลเป็น การตั้งค่าอัตราเฟรมของแอป แม้ว่าอุปกรณ์จะเปลี่ยนโหมด สถานการณ์

ขึ้นอยู่กับแอปที่จะตัดสินใจว่าจะโต้ตอบอย่างไรเมื่ออัตราการรีเฟรชจอแสดงผล ไม่ตรงกับอัตราเฟรมของแอป สำหรับวิดีโอ อัตราเฟรมจะคงที่ตาม วิดีโอต้นฉบับและเมนูแบบเลื่อนลงจะต้องใช้เพื่อแสดงเนื้อหาวิดีโอ ต เกมอาจเลือกที่จะลองเรียกใช้ที่อัตราการรีเฟรชจอแสดงผลมากกว่า ใช้อัตราเฟรมที่ต้องการต่อไป แอปไม่ควรเปลี่ยนค่า ส่งไปยัง setFrameRate() ตามสิ่งที่แพลตฟอร์มทำ การตั้งค่าควรจะยังคงอยู่ อัตราเฟรมที่ต้องการของแอป ไม่ว่าแอปจะจัดการกับกรณีที่ แพลตฟอร์มไม่ปรับให้ตรงกับคำขอของแอป วิธีนี้จะทำให้หากอุปกรณ์ เปลี่ยนเพื่ออนุญาตให้ใช้อัตราการรีเฟรชจอแสดงผลเพิ่มเติม มีข้อมูลที่ถูกต้องสำหรับเปลี่ยนไปใช้เฟรมที่ต้องการของแอป

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

การใช้การประทับเวลาเหล่านี้จะหยุดแพลตฟอร์มไม่ให้แสดงเฟรมของแอปด้วย ตั้งแต่เนิ่นๆ ซึ่งจะส่งผลให้เกิดการตัดสินใจโดยไม่จำเป็น การใช้เฟรมอย่างถูกต้อง การประทับเวลาการนำเสนอค่อนข้างซับซ้อน สำหรับเกม โปรดดู คำแนะนำเกี่ยวกับการกำหนดอัตราการแสดงโฆษณาเฟรม เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการหลีกเลี่ยงการพิจารณา และพิจารณาใช้ ไลบรารี Android Frame Pacing

ในบางกรณี แพลตฟอร์มอาจสลับไปยังอัตราเฟรมที่แอปได้รับ ที่ระบุใน setFrameRate() ตัวอย่างเช่น แอปอาจเรียก setFrameRate() 60 Hz และอุปกรณ์อาจเปลี่ยนการแสดงผลเป็น 120 Hz เหตุผลหนึ่งที่อาจ กรณีที่เกิดขึ้นคือเมื่อแอปอื่นมีพื้นผิวที่มีการตั้งค่าอัตราเฟรมเป็น 24Hz ใน กรณีนั้น การแสดงที่อัตรา 120Hz จะรองรับทั้งพื้นผิว 60Hz พื้นผิว 24Hz ทำงานได้โดยไม่ต้องดึงลง

เมื่อจอแสดงผลกำลังทำงานที่อัตราเฟรมของแอปหลายเท่า ควรระบุการประทับเวลาการนำเสนอสำหรับแต่ละเฟรมเพื่อหลีกเลี่ยงที่ไม่จำเป็น ผู้พิพากษา สําหรับเกม ไลบรารี Android Frame Pacing มีประโยชน์สำหรับ การตั้งค่าการประทับเวลาการนำเสนอเฟรม

setFrameRate() เทียบกับ PreferredDisplayModeId

WindowManager.LayoutParams.preferredDisplayModeId เป็นอีกวิธีหนึ่งที่แอปใช้ระบุอัตราเฟรมของตนในแพลตฟอร์มได้ ใช้บ้าง แอปต้องการเปลี่ยนอัตราการรีเฟรชจอแสดงผลเท่านั้น แทนที่จะเปลี่ยนอย่างอื่น การตั้งค่าโหมดการแสดงผล เช่น ความละเอียดในการแสดงผล โดยทั่วไป ให้ใช้ setFrameRate() จากราคาเต็ม preferredDisplayModeId setFrameRate() ใช้งานได้ง่ายขึ้นเพราะแอปไม่ต้องค้นหาผ่าน รายการโหมดการแสดงผล เพื่อค้นหาโหมดที่มีอัตราเฟรมที่ต้องการ

setFrameRate() ให้แพลตฟอร์มมีโอกาสมากขึ้นในการเลือก อัตราเฟรมในสถานการณ์ที่มีหลายแพลตฟอร์มทำงานอยู่ที่ อัตราเฟรมต่างๆ ได้ ตัวอย่างเช่น ลองนึกถึงสถานการณ์ที่แอป 2 แอป ทำงานในโหมดแยกหน้าจอใน Pixel 4 ซึ่งมีแอปหนึ่งกำลังเล่นวิดีโอ 24Hz ส่วนอีกรายการกำลังแสดงรายการแบบเลื่อนได้แก่ผู้ใช้ Pixel 4 รองรับ 2 อัตราการรีเฟรชจอแสดงผล: 60 Hz และ 90 Hz เมื่อใช้ preferredDisplayModeId API พื้นผิววิดีโอจะถูกบังคับให้เลือกระหว่าง 60 Hz หรือ 90 Hz โดยการโทร setFrameRate() ที่มีความถี่ 24Hz แพลตฟอร์มวิดีโอจึงมอบสิ่งที่ดีกว่า ข้อมูลเกี่ยวกับอัตราเฟรมของวิดีโอต้นฉบับ ซึ่งทำให้แพลตฟอร์มสามารถ เลือก 90Hz สำหรับอัตราการรีเฟรชจอแสดงผล ซึ่งจะดีกว่า 60Hz สถานการณ์

อย่างไรก็ตาม ก็มีบางกรณีที่ควรใช้ preferredDisplayModeId แทนที่จะเป็น setFrameRate() ดังตัวอย่างต่อไปนี้

  • หากแอปต้องการเปลี่ยนความละเอียดหรือการตั้งค่าโหมดการแสดงผลอื่นๆ ใช้ preferredDisplayModeId
  • แพลตฟอร์มจะเปลี่ยนเฉพาะโหมดการแสดงผลเพื่อตอบสนองต่อการเรียกไปยัง setFrameRate() หากการเปลี่ยนโหมดใช้ค่อนข้างน้อยและมักไม่เป็นเช่นนั้น ผู้ใช้สังเกตเห็นได้ง่าย หากแอปต้องการเปลี่ยนการรีเฟรชจอแสดงผล แม้ว่าจะต้องเปลี่ยนโหมดจำนวนมากก็ตาม (เช่น ใน Android TV อุปกรณ์) ให้ใช้ preferredDisplayModeId
  • แอปที่ไม่สามารถจัดการจอแสดงผลที่ทำงานบนหลายเฟรมของแอปได้ ซึ่งต้องมีการตั้งค่าการประทับเวลาการนำเสนอในแต่ละเฟรม ใช้ preferredDisplayModeId

setFrameRate() เทียบกับ PreferredRefreshRate

WindowManager.LayoutParams#preferredRefreshRate ตั้งค่าอัตราเฟรมที่ต้องการในหน้าต่างของแอป และราคาเหมาะสม ไปยังทุกพื้นผิวภายในหน้าต่าง แอปควรระบุแอปที่ต้องการ อัตราเฟรมโดยไม่คำนึงถึงอัตราการรีเฟรชที่สนับสนุนของอุปกรณ์ ซึ่งคล้ายกับ setFrameRate() เพื่อให้เครื่องจัดตารางเวลาให้คำแนะนำที่ดีขึ้นเกี่ยวกับจุดประสงค์ของแอป อัตราเฟรม

ระบบละเว้น preferredRefreshRate สำหรับแพลตฟอร์มที่ใช้ setFrameRate() ใน โดยทั่วไป ให้ใช้ setFrameRate() หากเป็นไปได้

PreferredRefreshRate เทียบกับ PreferredDisplayModeId

หากแอปต้องการเปลี่ยนอัตราการรีเฟรชที่ต้องการ ก็แนะนำให้ใช้ preferredRefreshRate แทนที่จะเป็น preferredDisplayModeId

การหลีกเลี่ยงการเรียกใช้ setFrameRate() บ่อยเกินไป

แม้ว่าการเรียก setFrameRate() จะมีต้นทุนไม่สูงนักในแง่ของประสิทธิภาพ แอปควรหลีกเลี่ยงการเรียกใช้ setFrameRate() ทุกเฟรมหรือหลายครั้งต่อ อย่างที่สอง การเรียกใช้ setFrameRate() มีแนวโน้มที่จะทำให้เกิดการเปลี่ยนแปลงใน อัตราการรีเฟรชการแสดงผล ซึ่งอาจส่งผลให้เฟรมลดลงระหว่างการเปลี่ยน คุณควรหาอัตราเฟรมที่ถูกต้องล่วงหน้าและโทร setFrameRate() 1 ครั้ง

การใช้งานสำหรับเกมหรือแอปอื่นๆ ที่ไม่ใช่วิดีโอ

แม้ว่าวิดีโอจะเป็นกรณีการใช้งานหลักของ setFrameRate() API แต่ก็สามารถ ใช้กับแอปอื่นๆ ตัวอย่างเช่น เกมที่ตั้งใจจะไม่วิ่งสูงกว่า 60Hz (เพื่อลดการใช้พลังงานและให้เซสชันการเล่นนานขึ้น) สามารถโทร Surface.setFrameRate(60, Surface.FRAME_RATE_COMPATIBILITY_DEFAULT) ด้วยวิธีนี้ อุปกรณ์ที่ทำงานที่ความถี่ 90 Hz โดยค่าเริ่มต้นจะทำงานที่ 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 เวลาที่คาดว่าการเล่นวิดีโอจะใช้เวลาหลายนาทีหรือน้อยกว่านั้น

ตัวอย่างการผสานรวมสำหรับแอปเล่นวิดีโอ

เราขอแนะนำให้ทำตามขั้นตอนต่อไปนี้สำหรับการผสานรวมสวิตช์อัตราการรีเฟรชในแอปเล่นวิดีโอ

  1. เลือก changeFrameRateStrategy:
    1. หากเล่นวิดีโอที่มีความยาว เช่น ภาพยนตร์ ให้ใช้ MATCH_CONTENT_FRAMERATE_ALWAYS
    2. หากเล่นวิดีโอสั้นๆ เช่น ตัวอย่างภาพยนตร์ ให้ใช้ CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS
  2. หาก changeFrameRateStrategy คือ CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS ให้ไปที่ขั้นตอนที่ 4
  3. ตรวจจับว่าจะมีการสลับอัตราการรีเฟรชที่ไม่ราบรื่นหรือไม่ โดยตรวจสอบ ว่าข้อเท็จจริงทั้ง 2 ข้อนี้เป็นความจริง
    1. ไม่สามารถสลับโหมดอย่างราบรื่นจากอัตราการรีเฟรชปัจจุบัน ( เรียกว่า C) สำหรับอัตราเฟรมของวิดีโอ (เรียกว่า V) การดำเนินการนี้จะ เป็นกรณีที่ C และ V แตกต่างกันและ Display.getMode().getAlternativeRefreshRates ไม่มีค่าพหุคูณของ V
    2. ผู้ใช้เลือกใช้การเปลี่ยนแปลงอัตราการรีเฟรชอย่างไม่ราบรื่น คุณสามารถตรวจพบ โดยตรวจสอบว่า DisplayManager.getMatchContentFrameRateUserPreference การคืนสินค้า MATCH_CONTENT_FRAMERATE_ALWAYS
  4. หากการเปลี่ยนดำเนินไปอย่างราบรื่น ให้ทำดังนี้
    1. โทร setFrameRate และส่งต่อ fps FRAME_RATE_COMPATIBILITY_FIXED_SOURCE และ changeFrameRateStrategy โดยที่ fps คืออัตราเฟรมของวิดีโอ
    2. เริ่มเล่นวิดีโอ
  5. หากกำลังจะมีการเปลี่ยนแปลงโหมดที่ไม่ราบรื่น ให้ทำดังนี้
    1. แสดง UX เพื่อแจ้งเตือนผู้ใช้ โปรดทราบว่าเราขอแนะนำให้คุณใช้วิธีการสำหรับ ให้ผู้ใช้ปิด UX นี้และข้ามการหน่วงเวลาเพิ่มเติมในขั้นตอนที่ 5 นี่คือ เนื่องจากความล่าช้าที่เราแนะนำนั้นสูงเกินกว่าที่จำเป็นบนจอแสดงผล แสดงเวลาในการสลับที่เร็วขึ้น
    2. โทร setFrameRate และส่งต่อ fps FRAME_RATE_COMPATIBILITY_FIXED_SOURCE และ CHANGE_FRAME_RATE_ALWAYS โดยที่ fps คืออัตราเฟรมของวิดีโอ
    3. รอ onDisplayChanged Callback
    4. รอ 2 วินาทีเพื่อให้การเปลี่ยนโหมดเสร็จสมบูรณ์
    5. เริ่มเล่นวิดีโอ

โค้ดเทียมที่จะรองรับการเปลี่ยนแบบราบรื่นเท่านั้นมีดังนี้

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();
}