Developer Update - 14 March 2024

Welcome to the Developer Update for 14 March 2024!

Today’s Dev Update thumbnail features Interstellar… by TontonDemon! Watch your step in the elevator and… try not to stand too close to the edge for this one, okay?

If you’d like to catch up, you can read our previous Developer Update from 29 February.

Important Info / Announcements

Join the Creator Economy

In case you missed it: Check out VRChat’s “Marketplace” tab in the main menu! It allows you to discover worlds and groups that you can support directly in VRChat.

We opened up applications for the Creator Economy a couple of weeks ago. If you’re interested in becoming a seller, please apply here!

Come on and Join the Space Jam!

:basketball: not included.

We have a World Jam ongoing until April 5th at 11:59pm EST / 8:59pm PST with cash and miscellaneous prizes! Read our blog post to learn more.

Venice Film Festival Submissions are Open!

Hello from the VRChat Art Team!

Reminder that applications for the 2024 Venice Film Fest are open!

We’ve been working directly with the Curators of the Venice International Film Festival to spread the word to VRChat Creators.

The Festival is held every year in Venice, Italy. (Although you don’t have to travel to Italy to enter the competition.)

In 2023, a total of 67 works were displayed in the Venice Immersive section, including 26 VRChat worlds. It’s a great opportunity to get your amazing work in front of new audiences and meet other artists from around the world.

The Submission deadline is 15th May 2024.

Want to know more?

Hop on over to the FAQ for more details to see if your project might be a good fit for the competition.

Good luck!

Ongoing Development

Group Ownership Transfer

As the eagle-eyed of you may have spotted, this was marked as in progress on Canny! This one has been asked for since the launch of Groups, and after figuring out some quirks around it, we’re finally happy to say that we are working on this feature.

In fact, we’re most of the way through building it! Many of the pieces for it are already in place, and we are currently working on getting the user interface changes and flows needed to let you start a transfer.

Very soon you will be able to transfer groups, albeit with some restrictions around who the new owner can be:

  • The new owner has to have a VRChat Account with a verified email
  • The new owner has to be a member of the group
  • The new owner has the space to own the group
  • The new owner has to have VRChat Plus
  • The group cannot be setup for the Creator Economy

The process works as follows:

  • Current owner initiates a transfer to the new owner

    • This sends an email to the current owner telling them about the transfer
    • Group Audit Log entry is created logging the start of the transfer
    • A notification is sent to the new owner
    • Meanwhile the old owner can cancel at any time before new owner accepts it
  • The new owner can accept or decline either via notification or the group view on the website

    • A notification of the Accept/Decline will be sent to the old owner
    • A Group Audit Log entry is created for either Accept/Decline
    • If accepted the group is transferred to the new owner
    • The old owner remains in the group but no longer has the owner role

Group Transfer Accept:

Group Transfer Decline:

Upcoming Changes to Standard Lite & More!

Typical Standard-based shaders in Unity attempt to interpret light probes linearly, which can get a few things wrong. Notably, they can create negative value shadows that erase the light from the other side of a bright light. You can see it here: being opposite a red light erases the red on the other side, causing a bluegreen effect:

This is one of the more common causes of weird/overpronounced shadows in worlds with baked lighting. The fix is to sample it in non-linear space, which doesn’t actually end up that much more expensive!

Diffuse and Bumped Diffuse should also be getting this upgrade!

(Psst, if you do anything with shaders, the above is probably a good idea too!)

We’re also developing some further improvements including pseudo-realtime lights for specularity, you can tune in to the discussion here!

Udon 2 Sneak Peek

Here’s some clips from our Udon 2 testing, demonstrating the performance improvements of a maze generator going from Udon 1 to Udon 2.

In Udon 1, this maze generator has to make use of several workarounds such as DataLists and DataDictionaries in order to be compatible with Udon 1, but those workarounds make it slightly slower. Udon 1 itself is also fairly slow, so this whole process takes quite some time.

Udon 2 (Direct port) Is what happens when you run those inefficient (and now unnecessary) workarounds in Udon 2. You get a substantial performance improvement already, just by compiling your existing code for Udon 2.

In Udon 2 (Optimized) those workarounds can be removed and replaced with more direct, efficient code that is more representative of what a normal C# developer would write.

This adds an additional, significant performance improvement on top, as well as makes your code more readable and maintainable. This also demonstrates how some parts of your code (such as instantiation) will still run into the bottleneck of Unity performance, and there’s not much of a difference there.

However, once it gets to the second part, it rockets ahead because the time is spent on the maze algorithm itself. Udon 2’s biggest performance improvements will be in situations where it needs to do raw calculations, without much interaction with Unity.

Runtime URL Construction for Udon

We’re giving Udon the ability to construct allowlisted URLs at runtime!

Currently, URLs provided by the world are locked in on upload, and can only be changed by reuploading the world. Only users can input URLs dynamically through VRCURLInputField, but Udon cannot do anything similar at the moment.

But with the new TryGenerateVRCUrl method, worlds will be able to use strings to construct URLs dynamically (as long as the URL is trusted) without user input. Here’s an example code snippet in UdonSharp:

bool success = VRCUrl.TryGenerateVRCUrl(urlStr, out VRCURL resultUrl);
if (success) videoPlayer.LoadUrl(resultUrl);
else Debug.Log($"Failed: the host of `{urlStr}` is not allowed to generate VRCUrl.");

For example, a world could download video URLs from a text file and use them to download images or videos.

Note that URLs must be on VRChat’s URL allowlist. It will not be possible to construct URLs that aren’t considered “trusted” by VRChat, even if “Allow untrusted URLs” is enabled.

We look forward to seeing how world creators will utilize this feature!

New Udon Event for Detecting Input Type

Udon now has an event called OnInputMethodChanged, which triggers whenever the user switches their input types, as well as once when they fully load into the world.

You can use this event to change instructions, icons and whatever else you want for Keyboards, Gamepads, Touchscreen, VR Controllers, etc. This will be forward-compatible with iOS, so replace your Android-But-Not-VR detection with this to make your worlds compatible with mobile devices!

In this example video, a user switches between the touchscreen and a game controller plugged into an Android phone, and the readout on-screen updates to match, without checking InputManager.GetLastUsedInputMethod() each frame.

Speaking of GetLastUsedInputMethod - this function now works properly in ClientSim, instead of always returning the default value of COUNT.

View Fallback Shaders for your Local Avatar

Fallback shaders are the shaders that display on an avatar if someone has disabled shaders in their safety settings while viewing it.

In release 2024.1.2, you’ll find a new option in the action menu to debug the appearance of fallback shaders on your own local avatar (this won’t have any effect on how others see you). The option will stay active when switching avatars but will reset on world change.

See these two images for a “spot the differences” challenge!

Fallback Shaders Off

Avatar File and Memory Limit Changes

If you create mobile (Quest & Android) avatars, you are likely already aware of the 10 MB file size limit. However, if you create for PC, it’s likely you aren’t aware of the limit on PC avatars – or, at least we hope you’ve never hit it! Right now that limit is 500 MB, which is larger than the majority of worlds.

That limit is the “Compressed Size” limit – in other words, how big the avatar is after it gets shoved into an asset bundle.

However, there’s another important number here, too: the “Uncompressed Size”. This is basically the amount of estimated memory usage that an avatar uses once it has been decompressed out of its asset bundle.

Last year, we quietly implemented a massive 1.2GB limit to the maximum uncompressed size of an avatar.

That change affected a very small amount of avatars, about 1 out of 10,000. For comparison, the vast majority (~98%) of avatars take up less than 600MB of memory when uncompressed!

We looked into those 1 out of 10,000 avatars. In every single case, the avatar had a massive amount of headroom for optimization, or were the equivalent of dozens of different avatars packed into one.

What are the limits being changed to?

We are changing the “Compressed Size” (download size) limit from 500MB to 200MB, and the “Uncompressed Size” (Estimated Memory usage) from 1.2GB to 500MB. These numbers aren’t completely locked in and may change.

We are making these changes because our current limits are still too high, and are negatively impacting users.

This would affect roughly 2% of avatars. While this isn’t an earth-shattering amount, it’s enough where we’d want to give ample warning.

On mobile (Quest/Android), the maximum file size will remain 10 MB. We will be introducing an uncompressed size limit of 40 MB with 2024.1.2. This is unlikely to impact many avatars.

We came to these numbers based on an analysis of currently uploaded avatars. If we find legitimate use cases that we missed, we might change them.

When are these new limits coming into use?

These new limits will go into effect on or around July 16th, about 5 months from the time of this post.

Between now and then, we hope to give everyone time to optimize their avatars within these limits and for us to release tools and guidance to help do so.

If we get close to this date and it doesn’t look like enough tooling and guidance is in place, we’ll consider pushing this date back.

As previously mentioned, a new uncompressed avatar size limit of 40MB will be implemented for mobile (Quest/Android) in VRChat 2024.1.2.

What’s being done right now?

It’s not very useful to have limits if no one knows what they are! We have both client and SDK changes lined up to better communicate these limits to creators, and to inform users when they come close to or exceed the limits

Likewise, in the SDK, we will block your upload if it exceeds the current limits. It will indicate which limit was broken, what the size of the limit is, and the size of your avatar.

examples:

PC Download Size breach:

avatarfilesize_sdk1
avatarfilesize_sdk3

Android Estimated Memory Usage breach:

avatarfilesize_sdk2

In the client, we will be adding in a couple of things to help educate users: first, the estimated memory usage will be listed in the avatar details page alongside the file size.

Second, we will be introducing a setting so you can set your own limit for the estimated memory usage of an avatar. Not everyone has the same amount of memory available, so this will allow you to adjust things to best accommodate your hardware.

In all, we want to improve the baseline standard of avatars so everyone can enjoy a smoother experience while also making it easier to create avatars that are optimized.

Aside: Don’t worry, we hear you asking for a VRAM-specific setting, too. While that isn’t part of this change, we know you want the ability to create a custom VRAM limit for avatars.

I’ve gone cross-eyed, can you sum up the before and after for me

Now After Change % Change
Uncompressed Size (RAM usage) 1200MB 500MB -41.6%
Compressed Size (Download size) 500MB 200MB -40%

How do I reduce the compressed and uncompressed size of my avatars?

If there was ever a VRChat avatar creator nerd snipe question, this is it. :cold_sweat:

Very generally:

  • Reduce the number and resolution of textures used in your avatar
  • Don’t use textures over 2K resolution. Each step of texture resolution increases memory/filesize by 400%!
  • Don’t use long audio files
  • Don’t use fully-keyframed animations, these can get really large!
  • Don’t pack many avatars worth of content into a single avatar
  • If you have multiple outfits, put each on a new avatar ID

Crunching textures may or may not help. Avoid relying on it. Crunch reduces quality and doesn’t affect uncompressed size at all. The AssetBundle compressor does a decent job at compression anyways, and finally, un-Crunching costs CPU time. As such, you shouldn’t use Crunch unless you know you need it.

You can get quite deep into avatar optimization if you’re not careful, but the rule that’ll get you 80% of the way there is “don’t put too much stuff on one avatar.”

Although we plan on adding more tooling directly into the SDK, there are currently lots of great tools to help optimize your avatar created by our amazing community! You can add them to your project via the Creator Companion. Some of these tools require little to no work once added, and benefit you just by following the basic setup!

Remember: these are tools developed by the community and not by VRChat itself. Here’s a small selection of the most relevant tools:

  • D4rk’s Avatar Optimizer: Automatically does a lot of optimization to improve your avatar, and has further in-depth tools to optimize your texture size and compression while retaining quality
  • Thry’s Avatar Optimization Tools: Use the Avatar Evaluator and VRAM analyzer to find textures that are too large or in the wrong compression format
  • VRCFury: A full modular avatar creation suite with a focus on optimized implementations. Easily add optimized toggles, sliders, animations, and drop-in modules like GoGoLoco

For more avatar optimization tips, please see our page here!

Conclusion

That’s it for this Dev Update!

Our next text update is scheduled for March 28, 2024. See you then!

27 Likes

group ownership transferring! finally, i no longer have to be the sole owner of the group i made for a friend because they didn’t have vrchat+ at the time.

5 Likes

This exact thing happened with a group I’m in. Its for event hosting, and a member who isn’t even active anymore is still the owner

This will be enforced client side right? So users can not set their download/vram limit higher than the upload limit.

Some great stuff in these notes but in particular…

Is this just texture memory usage? Do you plan to factor in Mesh memory usage eventually? Even if it’s still just textures though, WOOHOOO!

No, this is a limit on how much memory your avatar can use in RAM when your avatar bundle is decompressed.

No, it’s the size of the avatar after it has been decompressed out of its asset bundle packaging as it sits in your RAM.

This includes EVERYTHING – not just textures and mesh, but also animations, audio, shaders, currently-unrendered assets, etc.

It isn’t quite VRAM, but it is linearly related.

We didn’t include it in the dev update, but AFAIK this stat is also being added to the performance stat readout.

8 Likes

Psst (this is more towards the community)… There’s a huge void of (non-destructive) tooling for this right now. I think modular avatar MIGHT do this, but it’s not implemented into many avatars.

I think something that might be nice is if someone could build a tool where you can select, based on the user-facing expressions menu, what toggles/settings you want on your avatar (essentially, your “daily driver” settings for an avatar you’ve purchased from booth or gumroad), then it would determine what is and isn’t active on that avatar and “bake” an outfit in. Could also maybe give it a setting to keep a specific toggle in the final bake, if there’s something you don’t use by default but still frequently use (like a toggle for a prop, like a wand).

Doing all of this manually is a hassle - creating a copy of your avatar, creating copies of all your animators, of your parameters and expression menu definitions, etc. etc. etc. - so it would be nice to have automated tools if this is a recommended way of doing things.

It is enforced server side, so even if someone tries to use an older SDK or modify the SDK it will still be enforced

8 Likes

I’m really excited about having a maximum memory usage setting! Is there going to be a default limit, similar to how there’s a default download size limit configured for all users?

I really like that fallback shader testing feature. Would it also be possible to get a similar option for Animations?

3 Likes

The default for the estimated memory usage setting will be 300 MB on PC and 40 MB on mobile

2 Likes

When will the Maximum Estimated Memory Usage setting be coming to the game? I don’t see a date written. Still a WiP?

any news on VRCHeadChop? ill be able to remove a bunch of constraints from my avatar once that’s out, which should help a little with optimizing my avatar’s CPU usage

4 Likes

You should only need one constraint to make things visible in first person anyways. If you make a duplicate head bone that is rotation constrained to the head, you can have as many things as you want parented or weighed to that bone and it will be visible in first person.

It will be part of the next non-patch release

6 Likes

Pretty sure it’s in the next major release.

4 Likes

Note that URLs must be on VRChat’s URL allowlist. It will not be possible to construct URLs that aren’t considered “trusted” by VRChat, even if “Allow untrusted URLs” is enabled.

AFAIK Github.io is a allowed url so its possible to do a javascript redirect leading to a Untrusted URL (example.gihub.io/?redirect=https://www.google.comhttps://www.google.com), is this something that was thought about / allowed?

1 Like

So when do we get this change but for world limits from 100MB to 250 or 500mbs

and question on the group once the group has been transferred over to a new account or person can they then add creator economy stuff?

We need way to organize uploaded avatars to unpack avatars!

9 Likes