Update 26.02.25

Another round of optimizations and fixes, a few new features and Sandbox progress.

The editor loading splash got a new modern look, the key change is removing all the noise and showing you only what you need instead.

You can also override the image with a splash_screen.png file in your project folder.
Added a simple onboarding process for first-time users who want to know their way around the editor. This guide can be opened again at any time via the Help menu.

A big complaint in gmod was CurTime() losing precision after 9 hours of server uptime due to it being a single floating point. We have the same problem in s&box with Time.Now being a single float, as the server time increases stuff like gameplay, movement, interpolation and more begin to breakdown from the inaccuracy.
We've exposed Time.NowDouble, this won't noticeably lose precision until at least 200 days We've moved all internal systems like interpolation to it now.

We are considering making Time.Now a double by default but this would be a breaking change.
Sandbox tools have action hints now
And you are now able to remove constraints on all constraint tools by hitting reload. 
When spawning in dupes, we noticed that none of it was replicated properly to other clients. This was because we batched everything -- this makes all references and Compnent methods run in order, so stuff like constraints attach properly. We were spawning them over the network inside the batch, which meant everything was empty.

We've made it so batching also batches network spawns. You can use this with Scene.BatchGroup().

And we've added a nice progress bar when spawning dupes.
The Weld Preview now shows all connected objects.
The physgun tints orange when used in pull mode.
We've added some major improvements to the vertex painting tool this week.
  • Only trace to selected surfaces
  • Can paint backfaces
  • Added selecton modes / hardness falloff
  • Layers are named, and we will only show layers that exist
  • Overhauled gizmos
Open-source contributor DrakeFruit revamped the rotation gizmo, there is now a trackball and view-space rotation similar to Blender.
mat_toolvis was broken for a while and could only be used in the editor. We've now moved it from C++ to C#, made it work in-game again as well as added it to the F2 console menu to quickly see and change modes.
On theme for improving the platform experience, I've made some party system improvements this week.
  • When the party leader starts downloading a game, you'll start downloading the game too in the background. 
  • When they've finished, you'll go with them.
  • I've added some toasts to make it really obvious what's going on.
We've made it so that you can now set the Launch Mode for your game to Dedicated Server Only. When set to this mode, the game can only be hosted on a Dedicated Server and when players select your game in the menu, it will bring up a list of available servers to join.
As projects' code grows in size so do compile times, when we want an editor platform where it's quick to iterate and hotload, these large compile times are not good.
We've made improvements to incremental compile performance, so small changes should now recompile noticeably faster, especially in large projects.

Previously, our processors and codegen ran on the entire codebase every time you recompiled. Now, they only run on what's actually changed. Reusing more between compiles, reducing unnecessary re-parsing, allocations, and other work.

The impact of this can be pretty huge. Big projects where the difference between min/max compiles is greatest will see the most gains. In a pretty large project, compile times dropped from >8s to ~2s in my testing - a 75% reduction.

There's still more to look at with this, but hopefully a good first step. Faster iteration means better games, I prefer those personally.
Package resources were loaded and reloaded multiple times during game load, which made load times longer than necessary.
We cleaned up a lot of that redundant processing.
In testing, games that rely heavily on cloud packages loaded up to 20 seconds faster.


Source Engine had an extensive and overwhelming stats_display command, we've filtered and added the most useful parts to the performance overlays accessible through the F1 console.

Primarily this is the total frame time and GPU frame time, this is most useful for telling when you are CPU or GPU limited.
If physics objects fall forever they’ll eventually end up out of bounds in the physics engine. There’s now an event for that, so you can decide what to do. Disable them, or like Sandbox does, just delete the prop.
.NET’s garbage collector is really solid compared to Unity's GC, which means we generally have to worry about allocations a lot less. That said, on lower-end systems  (slow memory / small CPU-Caches) we noticed that GC can significantly affect performance.

To tackle this, we’ve updated our allocation overlay to show new metrics like stutters, total GC time, and more.

These allocations can come from the engine or even your own games. Let us know if you spot anything that looks like an unnecessary high allocation.
With the new overlay, we found some easy wins and shaved a few MB/s away, and we’re also seeing noticeably fewer total garbage collection runs in our Deathmatch benchmark.

This should already reduce stutters caused by GC a bit, especially on lower-end systems.

Metrics for average allocations over time are here: https://sbox.game/metrics/benchmarks

26.02.25

26.02.25
25 February 2026
59 changes in this update

Added

12 changes
  • Editor splash screen has a progress bar, no longer spews console, is customizable

  • Editor Welcome Guide

  • Time.NowDouble

  • Incremental compiles: smarter processing, syntax tree reuse

  • Games can have a dedicated server only launch mode

  • If a party leader is downloading a game, party members download it async in the menu

  • Mapping vertex paint selection modes

  • Updated Scene & Prefab Previews

  • Scene.BatchGroup disposable method obsoleting SceneUtility.RunInBatchGroup, also batches network spawns

  • Physics out of bounds event

  • Selectable abstract AnyOfType<T>

  • Gizmo.Control.Rotate now outputs Rotation instead of Angle, added trackball and view based rotation @DrakeFruit

Improved

29 changes
  • Mapping: Vertex paint traces only on selected surface

  • Mapping: Vertex paint shows verts with paint information

  • Mapping: Vertex paint can paint backfaces

  • mat_toolvis button in in-game console

  • mat_toolvis converted to managed from native

  • Minor menu style tweaks: use actual logo svg, hide LiveLobbyCard whilst loading, tweak notification badge styles

  • Startup background is smaller, lighter and uncompressed UI image

  • Several verbose logs moved to trace channel

  • Cleaned up main menu assets and transient files

  • Dedicated server no longer does unnecessary transform interpolation

  • rendersystemvulkan: use SDL_Vulkan_GetInstanceExtensions for surface extensions

  • Update Vulkan headers and volk (w/ valve mods)

  • rendersystemvulkan: use VK_EXT_surface_maintenance1 make swapchain recreation a bit better

  • SceneUtility.RenderToBitmap uses a normal scene instead of an editor scene so components execute normally

  • Improve allocation overlay (#4121)

  • Allocation overlay

  • Avoid StringToken boxing causing unnecessary allocations

  • Reduced Trace.WithCollisionRules allocations

  • Reduced Action allocations from Component.ExceptionWrap

  • Avoid per-frame KeyValuePair[] allocations when using Parallel.ForEach

  • Avoid allocations when creating and iterating CommandList

  • Remove need for second lightbinner for fog, just do it all on shader, we do classification on the shader itself, edge cases like fog disable are rare to require doing it with an entire new collection of lights

  • LoadAllGameResource only loads new resources

  • Make sure SeverPackages.InstallAll only reloads packages once

  • Close existing project settings window when opening new one

  • Use InvariantCulture in various places when parsing floats @MrSoup678

  • Don't show Max Player slider if Min players == Max players @nixxquality

  • Dynamic splash screen height to avoid stretching @boxrocket

  • Verify CreateGameResults cookie before usage @nixxquality

Fixed

17 changes
  • mat_toolvis convar doing nothing

  • Duplicated r_3d_skybox convars

  • BlitMode.WithBackbuffer actually respects WithMips setting (#4096)

  • physicalDeviceVulkan12Features.bufferDeviceAddress only enabled if hardware supports it (#4095)

  • addon type not having ProjectPage

  • Shadergraph: Don't generate TextureAttributes for albedo if its dynamic

  • Native Resource networking

  • PostProcessSystem does not run under dedicated servers

  • Custom loading screen not showing when joining to an existing session (#4124)

  • Envmaps, particles and light cookies not being marked as used, meaning they can end up evicted out of VRAM

  • GameObjectSystem configuration supports collections properly

  • Native resource reference networking

  • DirectionalLight gizmo line spacing @boxrocket6803

  • Tags not being applied to particle sceneobjects @LeDernierPoisson

  • Guard null button origin if none set in action @peter-r-g

  • list reorder not updating inspector for class types @Ardivaba

  • Enforce FriendsOnly lobby privacy during handshake @trende2001

Removed

1 change
  • Version overlay

matt
Facepunch
JoinedApr 2021 Posts263 Score2,045
Update 26.02.25 : news/update-26-02-25
Pol
Member
JoinedAug 2021 Posts21 Score935
noice
piC0peek
Member
JoinedSep 2021 Posts21 Score3,826
goatttttttt
Mexanik95
Member
JoinedMay 2023 Posts13 Score4,401
Let's Go!
CupCakeR
Member
JoinedMay 2021 Posts13 Score1,320
W
乃ㄖ乃爪卂匚 Ü
Member
JoinedJul 2024 Posts7 Score127
W update. 🗣️🔥
Zombie Extinguisher
Member
JoinedMay 2021 Posts14 Score1,285
Getting better every week, amazing!
K3rhos
Member
JoinedJul 2023 Posts58 Score680
Insanely cool, that's some great improvements !
edited 6 months ago#9
Coolitic
Member
JoinedJul 2024 Posts1 Score0
this won't noticeably lose precision until at least 200 days

W/ 52-bits in the significand, it would last much longer than that. At a ~1 micro-second interval (accurate enough for virtually all use-cases), a 64-bit float should last for: 2^52 / 1000 / 1000 / 60 / 60 / 24 = ~52k days.

As a small criticism, if you used integers instead of floats, it would never lose precision (it would just have a much higher hard-cap, rather than a lower "soft-cap" that gradually gets buggier).

When you need to accumulate many small amounts into a much larger amount, floating-point is simply not a good fit, because the advantage of floating-point disappears in that scenario. That's the reason that all the system-time functions across different operating-systems use integers (usually as micro- or nano-seconds). At an interval of 1 micro-second, a 64-bit unsigned integer timer would run for ~200m days.
G+
Member
JoinedFeb 2024 Posts75 Score3,100
Nice to see the community also is contributing to s&box
Nova
Member
JoinedFeb 2023 Posts4 Score2,875
Nice.
Regil
Member
JoinedAug 2025 Posts1 Score2,920
It's good! 
Jumper
Member
JoinedJun 2023 Posts2 Score660
Ocean When!
darkfated
Member
JoinedSep 2021 Posts14 Score380
Nice work
Giga Chad
Member
JoinedAug 2023 Posts8 Score7,242
Excellent work, awesome watching this project grow
meesles
Member
JoinedFeb 2026 Posts1 Score20
ty
Michaltntk
Member
JoinedJul 2023 Posts2 Score4,242
Faster iteration means better games, I prefer those personally. - solwllms
SUCH A BANGER OF A LINE 🗣️🗣️🗣️🔥🔥🔥🔥
people
Log in to reply
You can't reply if you're not logged in. That would be crazy.