Hi folks! Thank you for your questions. We couldn’t immediately respond to questions about Soba’s technical details, so we appreciate your patience. Our team put together a small FAQ that may give you a better idea of how Soba works and why it’s different from what we previously announced:
Q: Why did you decide not to use WebAssembly (WASM)?
A: WASM was very promising initially, but as development continued, our engineers encountered several downsides that would have made it difficult for us to release Udon 2 as initially announced.
The biggest reason is that WASM would have massively increased VRChat’s memory usage. WASM’s heap and the Mono runtime increased memory usage by one gigabyte in some worlds. This would affect all players, especially in ambitious worlds or on low-end devices. We concluded that a huge memory regression is unacceptable - but there are even more reasons:
- Apple forbids Just-in-time compilation (JIT) on iOS. JIT is the main reason for WASM’s performance improvements, so we would have needed to invest additional development time into making WASM work on iOS - and its performance would be lower than on other platforms.
- The WASM runtime added enormous complexity to our code. It added edge cases that hadn’t been fixed yet, made our development process slower, and would have distracted us from adding feature requests that the community had been asking for.
- WASM’s memory usage problems could get worse if we add additional features in the future.
Combined, these issues made it very difficult for us to proceed with WASM. Development took much longer than initially expected, and delivering everything we announced in time was impossible. We decided to spend a small amount of time to look for alternative solutions, which quickly led us to Soba.
Compared to using WASM, Soba’s development has been very fast. We’ve carefully limited the number of initial features and reused existing code whenever possible, making Soba small and easy to work on.
Q: Will Soba’s performance be higher than Udon?
A: Yes, but not in the first release.
Our preliminary benchmarks show the potential for over a 7x speedup on math-heavy code. And we may be able to achieve even greater performance in future updates.
However, we don’t think our benchmarks are ready to share yet because Soba is still in active development. We don’t want to overpromise anything, so we’ll share benchmarks once Soba is closer to a Closed Beta.
Q: Is Soba a replacement for Udon?
A: No, it’s not a direct replacement. But it contains many improvements compared to Udon.
While developing Udon 2, we realized how many worlds depend on unspecified behavior, which would be difficult to recreate in Soba. We want to maintain backward compatibility with Udon.
However, we also use Soba as an opportunity to fix bugs and design problems in Udon that we can’t fix without breaking backward compatibility. For example, for methods callable over the network, Soba is private-by-default, and uses a new [NetworkCallable]
attribute instead of adding an _
to the start of a method name to block it.
Q: Will I be able to convert my Udon scripts to Soba?
A: Yep! We’re working on it.
Q: Will Soba have generics?
A: Yes, but not in the first release. It’s on our roadmap!
Q: Will Soba have everything that was announced for Udon 2?
No, not everything. (In fact, the initial announcement contained many promises we shouldn’t have made at the time!)
However, Soba will still accomplish many of Udon 2’s overarching goals. Our goal is to be as transparent as possible, but we also want to avoid creating problems by sharing inaccurate information. We hope that Soba’s release will speak for itself, and that you’ll enjoy using it once it’s released! We’ll share more information about Soba in the coming months.