Set Display Refresh Rate

To create the best VR experience for your users, your app should produce high quality images, such as rich textures, while meeting the Oculus store required frame rate for the headset. If your app does not hit the required frame rate, it may exhibit judder, flickering black areas on the peripheries, or other performance-related problems. Reducing the graphical richness of the experience may cut down on the render time, but can result in a less realistic or less immersive user experience. The following table lists the current valid target display rates:

DeviceRefresh Rates
Oculus Quest60 Hz, 72 Hz
Oculus Quest 260 Hz, 72 Hz, 80 Hz, 90 Hz

Set Display Refresh Rate

Start by knowing the display frequencies available for the headset. Call OVRPlugin.systemDisplayFrequenciesAvailable to get an array of the available display frequencies. For example, for Oculus Quest 2, an array returns [60, 72, 80, 90] as available refresh rates.

float[] freqs = OVRManager.display.displayFrequenciesAvailable;

Using the values returned in the array, set the desired refresh rate. Call OVRPlugin.systemDisplayFrequency and assign the specific refresh rate.

OVRPlugin.systemDisplayFrequency = 90.0f;

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. This slowing down approach generally leads to a reduction in the frame rate and display refresh rate.

For example, a 90 Hz Quest 2 app might temporarily have its display refresh rate reduced to 72 Hz.

Handle Refresh Rates on Oculus Quest 2

Quest 2 apps may target 80 Hz and 90 Hz refresh rates with the following conditions:

  • The app must declare specific support for Quest 2 in the manifest file. For example: <meta-data android:name="com.oculus.supportedDevices" android:value="quest|quest2"/>

  • If an 80 Hz or 90 Hz Quest 2 app 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. The event contains information about the refresh rates the device has switched to and from.

Testing how an app handles dynamic throttling

You may test the 90 Hz to 72 Hz refresh rate change while your app is running by broadcasting 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...

Handle Refresh Rate Change Event

To let your app take action when the refresh rate changes from one rate to another, register the OVRManager.DisplayRefreshRateChanged event using a function signature Func(float fromRefreshRate, float ToRefreshRate).

OVRPlugin.systemDisplayFrequency = 90.0f;
OVRManager.DisplayRefreshRateChanged += DisplayRefreshRateChanged

private void DisplayRefreshRateChanged (float fromRefreshRate, float ToRefreshRate)
{
    // Handle display refresh rate changes
    Debug.Log(string.Format("Refresh rate changed from {0} to {1}, fromRefreshRate, ToRefreshRate));
}