Edit: It looks like they'd already done all this under the hood since the last time I had checked, and I was just too lazy to re-check. Serves me right, so I'm leaving the text up so the egg on my face is in full view. Lmao.
Consider this post "closed" or "duplicate".
Preface
On Quest hardware, particularly the Quest 2, there are
4 different performance levels
available to developers: Low, Medium, High, & Boost (the highest performance).
Whilst developers cannot manually set their level above 2 (high; count starts @ 0),
developers can set a preferred CPU & GPU level
which the system can acknowledge at times it sees fit (high load, external power, etc.).
Likewise, Quest development
also allows the ability to set a fixed "foveation" amount.
This effects the rendering quality of the pixels around the edge of the visual display for each eye, reducing load for elements within one's peripheral vision. Setting this to "High" can reduce load in exchange for a drop in peripheral quality, without a loss in primary vision quality.
Please add an "Adv. Perf." menu within the Performance options on Oculus Quest, with the options for "Performance Level" {Normal, Max} and "Peripheral Quality" {Low, Medium, High, Dynamic}
Implementation
## Performance Mode
The Oculus Unity SDK provides, through the
OVRManager
namespace, these options:
OVRManager.suggestedGpuPerfLevel()
OVRManager.suggestedCpuPerfLevel()
...which take a property of the enum
ProcessorPerformanceLevel
. By setting this to
ProcessorPerformanceLevel.Boost
, the application hints to the OS that it would like to run at maximum performance, if possible.
The user defined setting would map the "Performance" values "Normal" to
ProcessorPerformanceLevel.SustainedHigh
and "Max" to
ProcessorPerformanceLevel.Boost
.
On application launch, the game would read this setting and call the appropriate APIs for
both the GPU & CPU
to set its
preferred
level.
## Fixed Foveation Rendering
For Fixed Foveation Rendering, the Oculus documentation lays out the following:
To set the FFR mode, call the following functions:
OVRManager.fixedFoveatedRenderingLevel = FixedFoveatedRenderingLevel.High; // it's the maximum foveation level
OVRManager.useDynamicFixedFoveatedRendering = true;
OVRManager.fixedFoveatedRenderingLevel
is a variable which is of the type
FixedFoveatedRenderingLevel
, containing 4 levels:
Low
,
Medium
,
High
, and
HighTop
. — It is recommended to avoid
HighTop
as the foveation creeps into the primary visual area.
OVRManager.useDynamicFixedFoveatedRendering
is a variable which sets whether foveation rendering is dynamic; by setting this to true, the OS will scale foveation levels based on system performance. The previous setting will then be used as the "max" foveation level. By setting this to false, the OS will use the foveation level.
The user defined setting for "Peripheral Quality" would map the options "Low" to
FixedFoveatedRenderingLevel.High
, "Medium" to
FixedFoveatedRenderingLevel.Medium
and "High" to
FixedFoveatedRenderingLevel.Low
. (As
higher
foveation equals
lower
peripheral quality, these are inverted intentionally.) Additionally, a "Dynamic" option would be mapped to
FixedFoveatedRenderingLevel.High
and would additionally set
VRManager.useDynamicFixedFoveatedRendering
to
true
; all other options would set
VRManager.useDynamicFixedFoveatedRendering
to false.
By default, "Performance" would be set to "Normal" and "Peripheral Quality" would be set to "Medium" or "Dynamic".
Notes of Concern
I will admit,
I do not know if this will be compatible with your version of the Oculus API, as the Oculus Android API used by VRCSDK projects is deprecated
.; Likewise it has been a few months since I have checked whether or not VRChat is still running at GPU & CPU level 2.
Furthermore, higher GPU & CPU levels will shorten battery life and increase heat generation, so a warning the first time a user changes the setting may be in order, informing them that increasing the performance may decrease battery life.
No such issue exists for Fixed Foveation Rendering.
Being said, there is note of the ability to set the CPU & GPU level via the "legacy" VrAPI — Current Unity references refer to VrAPI as "legacy", but this is unknown to me whether it is the same APIs accessible to applications made with the legacy Oculus Android API.
Additional Note
It has been said the OS is more apt to use Boost Performance
when an application requests 90hz refresh or above.
Whilst I am unsure of the performance tradeoff of running VRChat at a higher refresh rate, it
may be worth looking into alongside the above features.