I have updated this first post to try to clear up some of the chaff now that DCS supports openxr natively.
The original post in it's entirety is in spoiler tags below, I have lifted portions of it for this but I wanted to retain it for archival purposes.
Since writing this I have upgraded my GPU from the 3070 to the 3080ti, as such I now have a little more knowledge on higher end hardware. Similarly DCS itself has changed in the ever marching way of progression that it has habit to do so, VR performance is now currently a little slower than it was 11 months ago.
This is based on my experiences and testing, specifically with my set up. It isn't an all encompassing guide and by all means feel free to add your own insights and observations
First things first set some baselines of what you want to achieve, do you want: -
- A clear, stable picture?
- All the bells and whistles?
- All the FPS?
For performance metrics use the tools built into openxr toolkit. For tuning create a test mission that has your typically heaviest passive GPU workload, I use a rooftop pass over the top of Beirut.
Some naming conventions: -
OXR = OpenXR (Installed with windows by default)
SVR = SteamVR (Steam App)
WMR4SVR = Windows Mixed Reality for SteamVR (Steam App)
OXRTK = OpenXR ToolKit (Obtainable from github)
OXRDT = OpenXR Developer Tools (Also known as OpenXR Tools for Windows Mixed Reality - Sourced from Microsoft App Store)
MR = Motion Reprojection
For detail of the functionality of the excellent OpenXR Toolkit by @mbucchia please see the features list here.
A clear, stable picture?
Doing the following will typically be running DCS at framerates below the headset refresh rate, as such there will be some associated ghosting/stutter. Some scenarios will be smoother than others.
Within the OXRDT set resolution to 100% and disable motion reprojection.
This will give the ultimate image quality but with the caveat that you have to tune DCS to keep framerates above your own personal comfort threshold for stutter (mine is 50fps).
If you're struggling to get it fast enough to eliminate the stutter for your test scenario, then the first thing to do is set the resolution in the OXRDT to default, this will set the resolution based upon your VRAM quantity. The calculation is based on the size of the three backbuffers with 4xMSAA applied should be no more than 10% of total VRAM. For the reverb having a 100% resolution of around 3160 pixels wide, the 8gb 3070 defaults to around 60-65%, the 12gb 3080ti defaults to around 95%.
Within the OXRTK menu you can enable foveated rendering and upscaling to gain some frames back but at the expense of some image quality. Turbo mode can subjectively claw some FPS back in certain scenarios; typically it can help you gain 10-20% when running below refresh rate.
It has been found that throttling the framerate to 55fps within OXRTK produces a minor improvement in apparent object stuttering when the headset is at 90Hz. This appears to be a sweetspot that has be correlated against by several different people, it may be different for you but it's easy enough to find your personal best compromise - fly low and level with the framerate throttled to 45fps, look out of the window whilst altering the framerate throttle and when you see an reduction of object ghosting leave it there.
Based on the above, if you can consistently keep >60 FPS then it is worth trying out 60Hz refresh rate. Being above the refresh rate is nirvana and is ultimately smooth with zero artifacts.
A couple of caveats to bear in mind: -
- the reverb has an apparent refresh rate flicker in 60Hz mode than can be hard to stomach, some people can, some people can't. It may be possible to train yourself to get used to it, treat it like getting your VR legs again. A little at a time is key, build it up in short sessions over days at a time.
- If you FPS drops below 60 then the smoothness of the display is not a good as 90Hz when below refresh rate. Therefore you ideally need some GPU overhead available to compensate for this - I use 60Hz and work on having a typical GPU frametime of 13ms or so which equates to around 77fps.
All the bells and whistles?
Doing the following will typically be running DCS at framerates below the headset refresh rate, however motion reprojection will be inserting synthetic frames to make it appear to running at refresh rate and will be very smooth. Image clarity suffers slightly and visual artifacting can be distracting.
Within the OXRDT set resolution to 100% and set MR to always on (don't use auto, that's for app specific configurations and not implemented for DCS as of yet).
Within the OXRTK menu make sure that MR is set to unlocked.
With MR enabled and unlocked, DCS is now able to smoothly display framerates from 90 all the down to 30. This is a huge range and it will allow you to run far higher settings than you would think.
Your FPS will be displayed as 90, 45, 30 or 22 (I've found 22 reprojected to not be pleasant) with occasional movement a few frames either way for a second or two when it changes reprojection fraction.
The further from the 90hz refresh you get the more reprojection has to pick up the slack so will introduce more artifacts. The coding behind the OXR implementation of MR is virtually identical to WMR4SVR so should behave the same.
The OXR MR can reproject at fractions of the refresh rate - 1, 1/2, 1/3, 1/4. For 90hz the fraction brackets work out at approximately 11ms 90fps, 20ms 50fps, 30ms 33fps (and we'll ignore 22fps because you don't want to be here), there is a small MR overhead to account for so the numbers aren't exact.
WMR4SVR can only reproject at 1/2 refresh rate, therefore below 20ms 50fps it disables itself entirely.
When tuning DCS you ideally want to be aiming to keep your FPS away from the bottom end of a fraction bracket. Therefore if you're getting 18ms you will be skipping between 1/2 and 1/3 brackets, best to turn some settings up and push it down into the 1/3 bracket.
MR will keep things smooth but at the expense of some warping/ghosting particularly on edges of wings/cockpit frames. The slower the relative motion between the two edges the less it will artifact. If you're suffering with watery looking distortions/artifacts then ensure that you don't have shaking reduction enabled as the two don't play nicely.
If you're ok with the artifacting you can run phenomenal settings, let it sit at 30hz reprojection and be on your way, unless you're in a weaker GPU then the world is your oyster.
All the FPS?
Within the OXRDT set resolution to default or below and MR to disabled.
Within OXRTK enable upscaling of your choice (I wouldn't recommend dropping below 75% to retain most image quality) and enable foveated rendering (you can use a preset or play with the custom settings, it doesn't make a huge difference in performance).
You may well be able to achieve the 90hz refresh rate by doing this although the use of upscaling will introduce additional shimmering that you will not get rid of.
It is possible to balance out portions of the above to achieve a desirable outcome; it's not gospel, play with it yourself to find your own ideal. My current settings are as follows: -
Reverb @60Hz, resolution override to 3200 pixels wide, MR disabled.
FFR on Quality/Wide preset, Turbo mode enabled.
NIS upscaling @75% with no sharpening.
With DCS settings as follows I can comfortably keep below 16ms (>60fps) on Syria on all but the heaviest of missions in which case the CPU gets swamped - the GPU is still producing frames fast enough, the CPU simply can't supply it fast enough. The multithreaded engine update should hopefully alleviate this issue moving forwards.
Spoiler
Hi all, due to the main thread becoming something of a monster I thought I would start this to hopefully aid people in tuning the Open Composite openxr mod for DCS by using the OpenXR Developer tools and OpenXR Toolkit.
This is based on my experiences and testing, specifically with my set up. It isn't an all encompassing guide and by all means feel free to add your own insights and observations
This is also based upon the open composite mod alone and not necessarily applicable with other mods involved. Also considering that the mod is correctly installed and set up. YMMV and all that jazz!
First things first set some baselines of what you want to achieve, do you want: -
- A clear, stable picture?
- All the bells and whistles?
- All the FPS?
- None of the FPS but clear, stable picture and all the bells and whistles?
- Flying with a Casio calculator watch for a GPU?
For performance metrics use the tools built into openxr toolkit or openxr dev tool, both show the same information one way or another. For tuning create a test mission that has your typically heaviest passive GPU workload, I use a rooftop pass over the top of Beirut.
Some naming conventions: - (edit: 17/05/22 Some updated info and naming for the various components)
OXR = OpenXR (Installed with windows by default or available from sourceforge)
SVR = SteamVR (Steam App)
WMR4SVR = Windows Mixed Reality for SteamVR (Steam App)
OXRTK = OpenXR ToolKit (Obtainable from github)
OXRDT = OpenXR Developer Tools (Also known as OpenXR Tools for Windows Mixed Reality - Sourced from Microsoft App Store)
MR = Motion Reprojection
A clear, stable picture?
Within the OXRDT set resolution to 100% and disable motion reprojection.
This will give the ultimate image quality but with the caveat that you have to tune DCS to keep framerates above your own personal comfort threshold for stutter (mine is 50fps).
If you're struggling to get it fast enough to eliminate the stutter for your test scenario, then the first thing to do is set the resolution in the OXRDT to default, this will set the resolution based upon your VRAM quantity. The calculation is based on the size of the three backbuffers with 4xMSAA applied should be no more than 10% of total VRAM. My 8gb card defaults to around 60-65%; image quality loss is fairly minimal compared to WMR4SVR in experience.
Within the OXRTK menu you can enable foveated rendering and upscaling to gain some frames back but at the expense of some image quality.
Your framerates will be unlocked but should be stable.
All the bells and whistles?
Within the OXRDT set resolution to 100% and set MR to always on (don't use auto, that's for app specific configurations and not implemented for DCS as of yet).
Within the OXRTK menu make sure that MR is set to unlocked.
With MR enabled and unlocked, DCS is now able to smoothly display framerates from 90 all the down to 30. This is a huge range and it will allow you to run far higher settings than you would think.
Your FPS will be displayed as 90, 45, 30 or 22 (I've found 22 reprojected to not be pleasant) with occasional movement a few frames either way for a second or two when it changes reprojection fraction.
The further from the 90hz refresh you get the more reprojection has to pick up the slack so will introduce more artifacts. The coding behind the OXR implementation of MR is virtually identical to WMR4SVR so should behave the same.
The OXR MR can reproject at fractions of the refresh rate - 1, 1/2, 1/3, 1/4. For 90hz the fraction brackets work out at approximately 11ms 90fps, 20ms 50fps, 30ms 33fps (and we'll ignore 22fps because you don't want to be here), there is a small MR overhead to account for so the numbers aren't exact.
WMR4SVR can only reproject at 1/2 refresh rate, therefore below 20ms 50fps it disables itself entirely.
When tuning DCS you ideally want to be aiming to keep your FPS away from the bottom end of a fraction bracket. Therefore if you're getting 18ms you will be skipping between 1/2 and 1/4 brackets, best to turn some settings up and push it down into the 1/4 bracket.
MR will keep things smooth but at the expense of some warping/ghosting particularly on edges of wings/cockpit frames. The slower the relative motion between the two edges the less it will artifact. Note that rotor blades cause havoc with this because it's shadows and model geometry moving at VERY high speeds.
MR is more suited to high flying with regards to artifacts as this keeps the relative motion low.
If you're ok with the artifacting you can run phenomenal settings, let it sit at 30hz reprojection and be on your way, unless you're in a weaker GPU then the world is your oyster.
edit 15/05/22: the MR artifacting appears to have been improved upon and it far better than previous. Helos don't turn into a screen of jelly all the time now
All the FPS?
Within the OXRDT set resolution to default and MR to disabled.
Within OXRTK enable upscaling of your choice (I wouldn't recommend dropping below 75% to retain most image quality) and enable foveated rendering (you can use a preset of play with the custom settings, it doesn't make a huge difference in performance).
You may well be able to achieve the 90hz refresh rate by doing this although the use of upscaling will introduce additional shimmering that you will not get rid of.
None of the FPS but clear, stable picture and all the bells and whistles?
See the below edit 08/04/22.
Flying with a Casio calculator watch for a GPU?
See the below edit 25/04/22.
These are my observations from testing and tweaking. Each and every one of us is different with different setups and requirements as such there is no right and wrong but I believe that the above is a pretty fair generic guide to get you started
I will probably add to this as the mod develops and matures. Hopefully this will help at least one person, if so then it was worth the hour it's taken to type on my phone
For reference in the A10C with my 3070 I can run 75% resolution, medium to high DCS settings with MR disabled and have a framerate over 50fps over Beruit. Over open ground in Syria I regularly see 55-65fps. In Caucasus I can either turn resolution to 100% or get framerates up to the high 70s. This performance is single player only so obviously things will change in multi player.
edit: This thread is intended as a guide to help set up and share experience and knowledge of setting up the OXR toolkits.
If you've got setup or configuration issues then you'd be better to ask in the main thread over here as there's a much wider range of knowledge and information there on the subject.
edit 30/03/22: Regarding reprojection
When tuning your DCS settings to aim for a specific target fps in order to keep in a specific reprojection bracket remember the following.
There is approximately 5fps worth of overhead required to keep a specific bracket active, therefore if you want to keep in the 45fps reprojection bracket then you will need to achieve a minimum of 50fps to do so. Your GPU frametime will be reading at <20ms (>50fps) but fps will be locked to 45fps (24ms).
edit 04/04/22: Regarding reprojection again
Whilst an issue with the OXR reprojection within DCS has been identified, the fix, if indeed possible, is not necessarily simple to implement and is looking to take some considerable developer time.
As such, the ETA for the fix will be two weeks (DCS time)....
In all honesty, it will hopefully come when it comes!
edit 08/04/22: Regarding framerate locking
Following conversations with devs and clever people on discord, if it's possible to lock your framerate to half refresh then the built in v-sync/reprojection in OXR can keep it all a lot smoother whilst freeing up GPU time to render more pixels and shiny stuff
I believe that this built in v-sync is analogous to oculus ATW.
@nikoel has been flying his apache around locked by AMD drivers to 45fps and claimed a smooth, stable image with all the bells and whistles turned on. As an nvidia user it is not possible lock VR framerates with the NVCPL, however it is possible with RivaTuner Statistics Server (RTSS).
Locked it to 45fps, lo and behold, perfectly smooth image. I do see some minor ghosting on the 3-9 line but anything in the front 150° arc is butter smooth. Upshot of this is previously I was running 75% resolution with med/high DCS settings to keep it around 60fps, now I can run 130% resolution with high DCS settings and it's just as smooth for the most part that is important!
As with all things, try it out, YMMV but it's certianly a very positive for me.
edit 10/04/22: Regarding high CPU times with locked framerate
During testing with the locked framerates I've noticed that the appCPU times in OXRDT performance overlay are locked to the FPS limit set, that is 22ms for 45fps.
My normal appCPU time is 11-14ms for my typical testing so seeing it jump to 22ms was somewhat alarming. This appears to be a normal function of the OXR runtime and is just the CPU performing a wait function to match the FPS times. As to whether the increased CPU latency causes a significant issue is yet to be seen.
I would ask anyone who's tried out the RTSS framerate lock and plays MP to see if it upsets performance. Hopefully it shouldn't do
edit 25/04/22: Regarding running DCS VR on a Casio calculator watch.
If you're running on a GPU that necessitates the use of lowhttps://forum.dcs.world/profile/13001-lefuneste01/ resolutions in OXR to achieve your desired frametimes then you can use the 3Dmigoto mod by @lefuneste01 to sharpen the HUD/MFD text a little to mitigate the blurriness.
edit 15/05/22: Regarding motion reprojection - currently (as of 15/05/2022) the artifacts caused by enabling motion reprojection appear to be quite significantly better than when this guide was written. Still not perfect but much better, this has been reported by others as well. I am currently still on the original manual install 0.6.3 version of OC_ACC and using v1.1.0 of OXRTK.
edit 17/05/22: Added some clarifications to the abbreviated names as suggested by @Dangerzone Also noting that the developer tools are now simply called OpenXR Tools. I'll not ammend any other abbreviations throughout this thread because it will be a nightmare!
edit 24/07/22: It's come to my attention that the upscaling within OXRTK different behave in the same manner as it used to in vrperfkit; I'm not sure if this is a recent change or not though.
In vrperfkit if you set upscaling >100% it would act as a form of supersampling at the expense of performance, in OXRTK it actually reduces the target render resolution the further away from 100% you go, in both directions. I have noticed that the image stability (specifically the micro aliasing introduced by the upscaling) appears to be lessened when running >100% and gives a cleaner image.
Running the G2 at 100% (3160 wide) FSR 150% has given a solid 10fps uplift and I'm touching on 80-85fps at times now on Caucasus with a really nice image quality
edit 08/09/22: Latest release of openxr runtimes 112.2209.2003 includes improved VRAM management to enable reprojection to be far more stable. Gone are the constant performance tanks when switching airframe or restarting a flight. Now reprojection should stay enabled at all times and not drop to a 15fps slideshow. This works for low VRAM GPUs, I helped test with my 8GB 3070 with very positive results. It's unlikely to make any difference to those with >12GB VRAM but basically anyone with a 3080ti and below on team green should see more stability; I'm unsure if the problem existed with team red with their 16GB cards.
edit 09/10/22: The latest versions of openxr toolkit has a built in framerate limiter so there is now no reason to use external limiters (RTSS / Radeon chill) which is a bit of a hacky way of doing it.
Note that if you limit the framerate, the GPU will be sitting idle for roughly the limit in ms minus your appGPU. Therefore 45fps (22ms) limit with 12ms appGPU would result in approximately 10ms idle time (less some overheads). This should in theory reduce heat and power consumption.
Edited by edmuss