Monthly Report: August
Added 2021-08-29 11:47:45 +0000 UTCEnd of the month, it's report time! Nearly all available VaM time still goes into the Benchmark project I announced in the last report.
What happened so far?
- Building technical basis for a Benchmark system inside VaM. Its a framework that can capture detailed timings for multiple parts of the scene. Its intended to work in tandem with a LogicBricks StateMachine to control the benchmark and the sub-parts.
- Figuring out an UI workflow that guides the user through the benchmark, building that UI in UnityEditor and loading in VaM via AssetBundle.
- Noob-Proofing: Figuring out how to check if the main scene was modified.
- Noob-Proofing: Figuring out whether the user has session plugins that might interfere.
- Noob-Proofing: Figuring out whether the user has declined the security dialog for any plugins used in the scene.
- Noob-Proofing: Figuring out whether VaM was running for more than 30min. Due to VaM/Unity measuring time in milliseconds with float precision, which means only 24bits or roughly 7 decimal digits, running for more than 1,800,000 milliseconds (30min) means time measurements are not precise enough anymore, if you care about accumulated millisecond differences like we do here.
- Noob-Proofing: Figuring out whether there is any user input, like opening menus, so we need to interrupt the benchmark.
- Ability to enforce any relevant UserPreferences when running in "official" mode and restoring the previous UserPreferences after the benchmark.
- Displaying used UserPreferences, System specs and of course the benchmark result on a nice result screen.
- Dumping the result screen info into a TXT file, in a format that can be posted easily to the Hub. (However, I might decide to change this into taking a screenshot instead, it allows for better formatting, colors, etc. Also not having two ways to display the same info should be less confusing)
- Figuring out how to counteract head-tracking. Especially when a character is close by, it can make a huge performance difference where you look at, for example because more or less hair needs to be rendered. I did not want to disable head-tracking, as that is also a performance factor. So the solution is to exactly counter-act head tracking every frame, essentially rotating the world around the player in the exact same way the head moved. Of course this is on the list of things to never ever do to avoid motion sickness, but it can't be helped, if we want results to be comparable. Sadly there seems to be a slight jitter, maybe because there is a one frame delay between head movement and correction. Still have to figure that part out.
- Figuring out how to fade the entire scene to black and back. Well, not technically necessary, but I don't want weird acting light sources and physics snapping into place between while switching between subscenes. This resulted in the ScreenFade plugin. As its useful in other contexts that just this benchmark project, I have added it to LogicBricks v10.
- Figuring out how wait for a scene to be fully loaded. I need to know exactly when its save to start measuring times. This can be useful for other scenes as well, so it has been added to LogicBricks v10 as well under the name LoadingDelay. This also benefited the fix I made for the FrameRateControl plugin, which was released with Essentials v11.
- Familiarizing myself a bit with Acid's Timeline and dealing with mocap animation. Since many VaM scenes uses this, it should be part of the benchmark in some way.
- Figuring out how to remove randomness from the Life plugin. Usually the whole point of the plugin is to add random breathing to make things appear more natural. However, morphs such as the used chest and stomach morphs affect a large parts of the body, which has some performance impact. So I needed to make some hacks to the plugin to have it play a pre-determined list of breaths instead, not make random changes to timings, etc. There is still some randomness, but it should only have a very minor impact.
What still needs doing?
- Noob-Proofing: Figuring out how to deal with Oculus Asynchronous Spacewarp (ASW) and SteamVR's Motion Smoothing enabled. These reduce motion sickness by introducing additional interpolated images when you fall below your headsets native refresh rate. For example if you run an Oculus Rift with 90Hz, but your machine can't make that, ASW will try to maintain 45 fps instead and introduce interpolated frames in between, so you still run 90Hz. Of course that means the application runs at either 90 or 45fps, with nothing in between. Since normally this is a really good thing to do, it helps a lot of people to not get motion sick, its of course enabled by default for both Oculus and SteamVR. However, for a benchmark where you want to figure out whether one system is slightly faster or slower than another system, using this is defeats the entire purpose. It would only tell you whether or not you can maintain stable 45 or 90fps, nothing more. So for a proper benchmark this needs to be turned off. The problem here is that as far as I can tell its not possible for an Unity application or VaM plugin to reliably figure out whether or not that's enabled, let alone turning it on/off for you automatically. I will probably have to go with asking the user whether this is on or off via a yes/no/maybe question, coupled with instructions how to turn it on/off, so I can display a disclaimer in the result screen.
- Noob-Proofing: I might need a similar question dialog to ask whether the machine is overclocked. I can't detect that from what data Unity Engine providing.
- Noob-Proofing: Adding checks whether subscenes have been modified. Should be easy to do, though.
- Noob-Proofing: Figure out how to at least read the Headset FOV setting and show it in the results.
- Figure out what to do with tracking of hands and additional trackers someone might have.
- Figure out a better way to attach the Benchmark HUD to the player head. Some headsets out there may have different FOV, so it might be positioned badly.
What happened to that 100$ scene commission?
Once the technical side of this is settled, I will obviously need a number of short scenes to actually run the benchmark on. For that reason I put out a commission last month to have someone build that scene for me. As probably most people, I have a life and a real job, so there is only so much time that can be put into VaM without going insane. Therefore the main intention from my side here was for me to save time, not cooperate for cooperation's sake.
While I got a couple of responses, sadly there was nobody among them I trusted to have fully understood the scope and complexity of what is needed. Maybe there would have been someone among them with the needed skills and time, but without some released scenes on Hub/Patreon with similar quality/complexity to show for, there is no way for me to know. There would have been a high risk of having to iterate back and forth 10-20 times to get what is needed, or failing altogether, if that someone was in way over their head. That might have meant having to spend more time discussing and explaining than it would take for me to do the work myself. Remember, the goal was to save time. Also its frustrating, for both sides. So I will probably do it myself, which means it will take a while.
However, I got permission from ReignMocap to use some of his mocap recordings for free. Also AcidBubbles allowed me to use part of a scene. In both cases there would still be lots of work required from my side to get it to a state that is usable for me. But its a start. I have not yet made a final decision on what I'm going to use, I might also end up using parts of one of my own scenes. Benefit of doing the work myself is of course that I can do it in my own time, not having to wait on anybody....and not wasting time because I wasn't able to explain what I needed in the first place :)
Cheers, MacGruber