The issue is that when you open a new level, the thread blocks. The level is not loaded asynchronously.
My solution was to create a VERY small level which starts loaded. Everything else is unloaded. When you transition into the new level, only the super small level is loaded. Then, when you enter the super small level area (which is black for now), I stream in the remaining “starter” levels. When those levels are finished streaming in, I teleport the player to the new level start location and then fade in from black. I have a near instant level transition time, so there is no need for a loading screen. Though, I could probably create a loading level zone in the super small level area.
Keep in mind that the persistent level is loaded in addition to the loading level, so the more stuff you put into the persistent world, the longer the load time is during world switches.
I still have some minor issues with the thread blocking in SteamVR, where a load time causes the player to revert back to the SteamVR gray grid world. Some people might get confused and think that the game crashed, when it’s really just loading. I’m still hunting for some best practices on how to do world switches as seamlessly as possible in VR.