1. Neos VR
  2. News
  3. Metaverse Maker Competition nearing end, first significant optimizations

Metaverse Maker Competition nearing end, first significant optimizations

Hello and welcome to another weekly update!

This week we have started our work on optimizations, focusing on the low hanging (but still delicious) fruit first. We’ve optimized the Skinned mesh rendering, Viseme Analysis and some other smaller things, getting some pretty decent first performance boosts as a result (e.g. 25 % framerate increase with stress test using many avatars), with a lot more to come.

The Metaverse Maker Competition is also nearing the end and with everyone finishing their submissions we want to make sure you tag your submission properly, so it doesn’t get missed. Details on how are below, make sure to double check if your submission is submitted properly!

Neos is now also available in more languages thanks to our amazing community! Neos is now also available in Finnish (thanks to AdmiralSoap and Napo), French (thanks to Archer and FreakyWaves) and Dutch (thanks to jeana and Beaned).



[h2]Metaverse Maker Competition nearing the end[/h2]
The community-held creative contest by Creator Jam only has a few days left before its end. If you’re participating, make sure you submit your entry before Oct 1, 14:00 EST(UTC 18:00) Thursday. It is recommended to submit early, as you can make updates before the end. However updating the entry after the cutoff is not allowed until the judging finishes.

Also importantly, your entry must have the “MMC” tag so it is properly categorized and filtered, as well as a subcategory tag that’s either “World”, “Avatar” or “Other”. If you’re not sure how to tag your entry, check the following video by Medra:
[previewyoutube][/previewyoutube]

Once the entries are submitted, the timeline is as follows:

Oct 2-4 Audience voting inside Neos.
Oct 4-9 Frooxius, 0utsider, Medra, Jak Wilmot, and Kent Bye will judge the entries.
Oct 10 Winners will be announced live in Neos via twitch stream.

The voting is going to be done through Neos itself, using a voting system created by ProbablePrime. If you’d like to learn more about it, check out his video:
[previewyoutube][/previewyoutube]

We’ll be also adding an official “MMC” category in the “Worlds” menu in Neos in the next build, so you can use it to double check if your entry is properly listed! We wish everyone good luck in the last few days and we can’t wait to see all the amazing stuff you have built during the past month!

[h2]Skinned Mesh Renderer optimizations & culling modes[/h2]
We have started profiling Neos more heavily with various tools in populated sessions to gather information about how different parts of the engine perform and where the bottlenecks lie. We have confirmed many of the known causes of performance issues and found some new ones.

[previewyoutube][/previewyoutube]

One of the big ones that was quick to address were Skinned Mesh Renderers, particularly how they update their bounds and how they’re culled. Neos now supports 4 different modes for updating the bounding boxes:

  • Static - bounds are based on the mesh alone and do not update. This is the new default as it has no overhead and works well in most cases
  • Fast Disjoint Root Approximate - this mode pre-computes approximate spherical bounds for groups of bones (all overlapping bones get merged into a single root one) which are then used to compute the approximate bounding box. This is typically very fast, as most meshes have just one to three bone groups. It produces bounds that are bigger than needed to be, but still offer good culling.
  • Medium Per-Bone Approximate - this mode uses bounding boxes of each bone of the mesh. This provides more accurate bounds without actually transforming the geometry, but with bone-dense meshes will take a lot more performance.
  • Slow Realtime Accurate - this actually transforms the geometry every frame and uses that determine visibility. This is significantly slow, but most accurate, taking into account blendshapes as well. Recommended only when absolutely needed.

This provides much more flexibility now, rather than a constant forced slow method. Most meshes do well with the “Static” method, with “Fast Disjoint Root Approximate” providing much faster fallback in cases where the meshes get incorrectly culled.

When you’re wearing an avatar, it will automatically use “Fast Disjoint Root Approximate” for yourself, but you might need to switch to it explicitly if other users see parts of your avatar popping off.

However if possible, we strongly recommend baking your avatar meshes into a single one, which will provide a combination of best performance and culling behavior. The in-game Glue tooltip has “Skinned Mesh” baking mode, which preserves and intelligently combines all the bones and blendshapes of your mesh and allows easy way to optimize your avatars without leaving VR.

With this optimization, we have noticed about a 25 % framerate increase in a world with many avatars.

https://www.youtube.com/watch?v=w-NhlyhfVBM
Some behind the scenes of development of these new algorithms

[h2]Viseme Analyzer[/h2]
Another of the low hanging fruits, but significant contributors to performance issues was the VisemeAnalyzer component, which uses the OVRLipSync library internally. Not only is the viseme analysis quite expensive (roughly 1 ms per user per frame), but it’s not properly multithreaded.

This has caused internal thread starvation, as Neos schedules heavy work on its pool of background threads, taking lots of CPU time away from useful work on other background tasks.

To fix this, we have moved the analysis to its own queue with a single background thread to avoid it from starving the thread pool and also importantly added mechanism where visemes from other users are now streamed over network, with your system only responsible for computing your own and any others not associated with an use (e.g. using it for music visualization).

These changes will heavily reduce the CPU usage in populated worlds, freeing up more system resources for other tasks and reduce occurrences of pathological behavior, where UI and other things will start locking up due to not having any background threads to run on.

[h2]Value Streams and others[/h2]
Some other related optimizations involved reducing various overheads. Notably we introduced MultiValueStream, which can stream multiple values with the same settings, rather than using individual ValueStream for each.

This helps significantly for things like hands (or the visemes above), which contain many bones and save some CPU and memory usage, while producing the same results as before.

Many other parts of the engine and its internals have received small optimizations as well, to read more about them, check out the #neos-updates channel on our official Discord or the release notes on Steam.

[h2]Collider User Tracker, Silencing users and more[/h2]
While the focus is on optimizations, we’re adding new features as well. Some of them are designed to allow you better optimize your own creations as well, such as the new ColliderUserTracker component.

This component tracks users inside a collider (setup as a trigger), automatically providing information if any or the local users are inside. This allows you to easily setup culling zones or build things like automatic doors and other behaviors.

Another addition is the ability to Silence users, which helps with self-moderation. Unlike Mute, it will Silence the user for everyone in the session, which can be helpful in many cases, for example users with significant echo. For list of other new features, check out the update notes on Steam or our official Discord.

[h2]Community September Showcase[/h2]
As usual, the last stream of the month is dedicated to you, our community and all the amazing things you have built. If you missed the Friday stream, you can watch the archive here. We take a look at few of the already published MMC entries and other creations:

[previewyoutube][/previewyoutube]

[h2]What’s next?[/h2]
We’re going to be focusing on more optimizations in the upcoming week based on the profiling data, gradually improving performance of Neos as we go.

We have a few smaller, but impactful optimizations planned, like revamping the moved event system, but we’ll be transitioning to bigger architectural reworks and improvements, which will help unlock significant performance gains and implement new optimization features.

To get the latest info, you can keep an eye on the #devlog channel on our official Discord. Thank you for reading and as always, thank you for supporting Neos and making it better every day!