Set Display Refresh Rates

The display refresh rate represents how many times per second a headset’s screen refreshes. A higher refresh rate enables higher frame rates, brighter output, and improved color clarity. However, higher refresh rates rates require your app to perform its work in shorter amounts of time.

The default display refresh rate for Quest and Quest 2 apps is 72 Hz. If you want to run your app at a different refresh rate, you are responsible for ensuring that your app is performant enough to sustain that rate. Apps that can’t consistently render at the desired display refresh rate will fail Oculus Quest Store review. Such apps might exhibit judder, flickering black areas on the peripheries, and other performance-related problems.

Get Refresh Rates Supported by the Device

Display capabilities differ between Oculus Quest models, with Quest 2 capable of higher display refresh rates. The table below lists the currently available refresh rates by device for convenience only. You should always confirm programmatically that the refresh rate you want is valid on the user’s device before attempting to set that rate.

Device Model60 Hz72 Hz80 Hz90 Hz120 Hz
QuestMedia
apps
---
Quest 2Media
apps
Experimental

120 Hz is only available on devices where the user has enabled 120 Hz as an experimental feature. If a user hasn’t turned on this experimental feature, this refresh rate won’t be available to developers. To turn on 120 Hz yourself, open the universal menu, go to Settings > Experimental Features, and then enable 120 Hz.

60 Hz must only be used by media player apps. It is provided as a way to synchronize 30 FPS or 60 FPS video with the display refresh rate for smooth playback. Non-media player apps that set the display refresh rate to 60 Hz will fail Oculus Quest Store review.

To get the list of refresh rates supported by a device:

  1. Use vrapi_GetSystemPropertyInt() with VRAPI_SYS_PROP_NUM_SUPPORTED_DISPLAY_REFRESH_RATES to get the number of elements in the array that contains the supported refresh rates.

  2. Use vrapi_GetSystemPropertyFloatArray() with VRAPI_SYS_PROP_SUPPORTED_DISPLAY_REFRESH_RATES to read the supported refresh rates into your own array.

For example:

int size = vrapi_GetSystemPropertyInt(app->GetJava(),
           VRAPI_SYS_PROP_NUM_SUPPORTED_DISPLAY_REFRESH_RATES);

std::vector<float> supported_rates(size);

int elements = vrapi_GetSystemPropertyFloatArray(app->GetJava(),
           VRAPI_SYS_PROP_SUPPORTED_DISPLAY_REFRESH_RATES,
           supported_rates.data(), size);

Set a Refresh Rate

If you want to set refresh rates higher than 72 Hz on Quest 2 devices, you must first ensure the Android Manifest file includes quest2 as a supported device. For example:

<meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2"/>

To set a refresh rate:

  • Call vrapi_SetDisplayRefreshRate() with the desired refresh rate.

    For example:

    ovrResult result = vrapi_SetDisplayRefreshRate( app->GetOvrMobile(), 90.0f );
    

Considerations for Refresh Rates over 72 Hz

Quest 2 apps may target display refresh rates higher than 72 Hz on the following conditions:

  • The app must declare specific support for Quest 2 in the manifest file.

  • Oculus Quest and Quest 2 deal with issues of excess heat and power consumption in a similar way to mobile devices such as phones and tablets: the system slows down the device temporarily to reduce power consumption and help cool the device. If a Quest 2 app with a display refresh rate higher than 72 Hz experiences thermal events, dynamic throttling may reduce the refresh rate to 72 Hz as a first step. If thermal conditions worsen, dynamic throttling may take an additional step and reduce the frame rate to 36 FPS while keeping the refresh rate at 72 Hz (the equivalent of minVsyncs=2).

  • While most apps don’t need to change anything about their behavior if they are throttled, apps that want to be kept aware of refresh rate changes can hook to a new event for Display Refresh Rate Change.

Handle Refresh Rate Change Events (Optional)

If you need your app to know if dynamic throttling reduces the refresh rate so that the app can respond in some way, you can do so through the event VRAPI_EVENT_DISPLAY_REFRESH_RATE_CHANGE. Its event structure is as follows:

typedef struct ovrEventDisplayRefreshRateChange_ {
   ovrEventHeader EventHeader;
   float fromDisplayRefreshRate;
   float toDisplayRefreshRate;
} ovrEventDisplayRefreshRateChange;

Testing how an app handles dynamic throttling

You can simulate the dynamic throttling to 72 Hz from a higher display refresh rate. While your app is running, broadcast an intent through the adb shell activity manager. For example, this command simulates throttling for 10 seconds:

adb shell am broadcast -a com.oculus.vrruntimeservice.COMPOSITOR_SIMULATE_THERMAL --es subsystem refresh --ei seconds_throttled 10

If you aren’t able to see a visible change in your app, you can verify the refresh rate change by looking in the logcat for VrApi events that show an FPS value pair. The first value is the frame rate. The second value is the display refresh rate. For example:

VrApi   : FPS=90/90,Prd=33ms,Tear=0,Early=0...
VrApi   : FPS=87/72,Prd=33ms,Tear=0,Early=0...