Unity Mipmap Streaming in VRChat

Hello,

I was curious about Unity’s Mipmap Streaming and whether or not, or the extent to which, it is included in VRChat.

I do know that for avatars, you can create mipmapped textures and enable texture streaming for the avatar. But I wasn’t sure about the effectiveness of this and how to tune it to be more performant.

I obviously ask because we have a such a huge problem with many avatars using extensive amounts of VRAM. I often find with a certain group I meet with, that VRChat will max my 8 GB of VRAM and use 15-20+ GB of system RAM with 30-40 people present in a world.

So I wanted to know the level to which VRChat currently uses mipmapping, and what the best practices are to help reduce VRAM usage on Avatars.

I do know that the mipmaps are used, but not sure if the higher levels are streamed in, or not. Normally unity takes in a PNG and cranks out suitable texture with mips, but you can import premade textures. With premade mipmaps, can make them noticably different so you can see the different levels blended in.

With your performance problem I wonder if they’re asking for streaming mipmaps but aren’t getting use out of it. I guess the test would be to make the highest level noticably different from the rest and then see if any delay in seeing the highest level can be caused

1 Like

Hi @dark, thanks for posting your question!

If you haven’t already, you can post it as a feature request on feedback.vrchat.com.

To answer your question: VRChat currently doesn’t support streaming mipmaps. It’s something we might decide to add at some point, but some issues would need to be addressed first.

Most notably - some user avatars may lack mipmaps, have them disabled, or have a maximum priority. This would adversely affect mipmaps with streaming enabled: Once you run out of VRAM, they’d appear blurry and stuck at a lower mipmap. Users might run into this issue maliciously, or accidentally.

We hope this helps you understand why we currently don’t support mipmap streaming. Perhaps it’s something we can look into in the future!

1 Like

Right now the current SDK is adamant about streaming mipmaps being turned on, you can unintentionally sidestep this with a material swap. But I try to make sure it’s enabled.

Is it possible for bad settings to be corrected at runtime? I guess if implemented there should be some advisement of acceptable value for avatar, and personally I think if people exceed the priority, make it roll over to something exceedingly low.

Or just set priority to the same value on all avatar texture and just roll with it?

That’s a great idea, and would probably have to be part of the solution!

Unfortunately, that wouldn’t fully solve the problem, as avatars uploaded without streaming mipmaps enabled effectively have an ‘infinite’ priority.

2 Likes

I see, thanks for the insight!

I know many games have an option to toggle Texture Streaming on and off. Would it be possible for VRChat to also do this? This way users can at least enable it as an experimental option, especially since many avatars (afaik) already have mipmaps enabled.

I created a feedback request that is available here: Canny

But it does solve the problem still, no? Sure, they may have infinite priority, but that’s no different than how the game is now, right? Unity docs does mention that it can still load textures without mipmaps alongside mipmapped textures.

This would mostly solve the problem. I do not think a universal adoption to mipmaps needs to be a priority for the feature to exist. And if the feature did exist, users that do not use mipmaps can eventually be encouraged to do so when their avatar further lags out instances.

That might be useful, yeah.

Not quite. With mipmap streaming, if you run out of VRAM, you’d see avatars get stuck at lower, much blurrier mipmap levels. Players who decide not to use mipmaps or mipmap streaming would always appear at full resolution.

1 Like

Oh, I see. Thanks for clarifying.

Well, at the very least, I am hopeful for an experimental option. I do know it takes extra dev time, but having a feature like this I think would be useful, even if it only partially works.

It would be unfortunate if users got stuck on the lowest setting with VRAM maxed out, but I think that would be better than not having it at all. At least at that point, more people can be urged to use mipmapping, or VRChat can even eventually require it outright if the feature works well.

1 Like