Update 26.04.15

Developer Preview is closed 🛑, UI batching big FPS gains 🚀, tying up all the loose ends 🪢

Developer Preview Closedby matt

Thank you for everyone that has helped us during this period - the developer preview is now closed!

The developer preview has been invaluable to the development of s&box, putting the engine in front of it's core audience from day 1 - you guys telling us what you love and what is shit has turned the engine into what it is today.

We'll be open again on Steam on the 28th April for $20.

Developer Preview Revokesby matt

image.png 25.11 KB

Out of 800,000 people who joined the developer preview, 40,000 get to keep it and the rest have been revoked.

Who got to keep it:
  • Developers who have published games people have played
  • Anyone who has purchased any cosmetics
  • Anyone who has played a good amount and actually opened the game this year
We're doing this in batches, making sure it's right, it might take a short while to complete.

UI Batchingby antopilo

I've merged the UI batcher, which means UI will render much much faster now.

You can expect major performance improvements in your user interfaces(which is almost every game) with some users reporting up to 54% more FPS while on the menu.

Batching

Previously we would render each panel individually as we traversed the DOM. The GPU would paint each individually which worked fine for a while. But as complexity grew, the number of individual draw that your GPU would execute would affect performances.

We can now, in the best case scenario, draw everything all at once.

Discovery Page

Our discover page went down from 1080+ draw calls to only 5.

This is what your GPU was doing before. Each line is a draw call.
image.png 19.85 KB
And this is after. 
image.png 5.28 KB
Here is a video replaying each draw one by one with a before and after.
Timeline 1.mp4 9.98 MB

Other pages

The other pages of the menu are drawn in a single call, which unfortunately doesn't make for a very exciting video as its drawn in a single step.

Overall, this was a much needed improvement as the complexity of games and user interfaces grew. We plan on working on this a bit more to optimize other aspect of our UI pipeline.




Main Menu: Searchby alex

We've made it easier to search by putting a nicely accessible search bar in the middle of the navbar:
image.png 92.9 KB
This is pretty basic, and we'll improve it over time - but we're hoping it makes it easier to find the games you want to play.

Serialization Improvementsby Lorenz

Our floating point serialization had a precision bug that caused values to appear changed even when they hadn't been touched, leading to noisy git diffs.
This is now fixed and you should no longer see large unexpected diffs like this one in your scenes or prefabs.
15_09-50-StrictSnowyowl.png 65.74 KB

Prefab Editor Improvementsby Lorenz

This week we made a bunch of improvements to prefab editing.
  • Faster: Less memory allocation and wasted work when editing prefabs.
  • Cleaner diffs: Nested prefab operations no longer regenerate all GUIDs.
  • Missing prefabs: instances with deleted prefab files now show as "broken" instead of throwing an error;
    data is restoreed if the prefab file comes back.
    07_15-49-WhiteSloth.png 5.55 KB
  • Bug fixes: Reverting nested prefabs no longer wipes parent overrides; creating a prefab from a GameObject correctly restores positions.



Mapping: Model To Meshby bakscratch

We've added a tool that lets you convert a model into a map mesh.
575858247-343f8bdc-373b-4f46-b766-15a3e5d6f680.mp4 17.5 MB

NavMesh: On-Demand Generationby Lorenz

Add DeferGeneration property to skip navmesh generation during scene load, allowing tiles to be generated and unloaded on demand at runtime.

New public API:

// Skip tile generation on load
bool NavMesh.DeferGeneration

// Request tile generation (fire and forget)
void NavMesh.RequestTileGeneration( Vector3 )
void NavMesh.RequestTilesGeneration( BBox )

// Remove tiles from the navmesh
void NavMesh.UnloadTile( Vector3 )
void NavMesh.UnloadTiles( BBox )

Ambient Occlusion Optimizationsby Sam Pavlovic

Ambient Occlusion is currently the biggest bottleneck in low end systems.

We shipped a few optimizations to SSAO, it's using Hilbert Tree instead of Blue Noise, this allows us to use less brute forced samples to resolve the same perceptual result.

On top of that we are using Float16 logic instead of Float32 on it now, which should have a considerable speedup in some GPU families.

There's more to do with this but it's better to ship it in small, quick iterations, being able to use proper Motion Vectors and a good bilateral upsampler should reduce the need to do brute forcing greatly.

Keep Uprightby devultj

We've added a parallel / upright joint, so you can keep objects upright reliably.
578263473-ad07d349-971c-450b-b3be-e4e05143bbe4.mp4 5.65 MB
As an added bonus, you can also link two objects together and they'll stay parallel.
sbox.2026.04.15.14.16.32.mp4 10.04 MB


Documentationby matt

The documentation has been getting a lot of love, we have a lot of great content on there but the discoverability and flow was non obvious. I've been rearranging it all, polishing up the Getting Started, adding more top level sections as well as "hub" pages. There's been a lot of community contributions already too since we open-sourced it last week!
image.png 58.76 KB

Dedicated Servers: Texture Resourcesby devultj

For a long while now, if a dedicated server networked a GameObject with a Texture reference, it was nulled out and never sent. This is because servers don't load texture data, which makes sense. But because of that we were never registering them in our managed engine. 

So we're registering them now -- this doesn't mean you can start reading texture data on the server, you can't. However, networking these resources will work as intended now.

Summaryby matt

It's the end of an era with the developer preview closing - 5 years ago we got Source 2 and we almost immediately opened up to developers, letting them try out the toolset from when there was very little, so we could see what was great and what wasn't.

This feedback loop was vital to get to where we are, seeing people want to push the boundaries of Source 2 further and further until we ended up rewriting half the engine from entities into the convenient scene system we all love today.

A huge thank you to everyone in the community who've participated along all the way, and helped define what s&box is today.

Everything we do is to provide opportunities for the next generation of developers, be it with our Play Fund, cosmetic creators, open sourcing, or exporting standalone games royalty-free to Steam.

We're only a couple of weeks away now, we're running out of loose ends to tie up, we're pretty confident now, we know what we're offering and what we're not offering, there's no over promising, we're excited to cross the line and start a new cycle of development, and continue to evolve alongside everyone.