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:
Device | Refresh Rates |
---|---|
Oculus Quest | 60 Hz, 72 Hz |
Oculus Quest 2 | 60 Hz, 72 Hz, 80 Hz, 90 Hz |
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.
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.
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...
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)); }