Update 25.11.12

A small update focused on optimizations and fixes

Small Updateby matt

It's a hackweek this week at Facepunch - so everyone is scratching their itches and expanding themselves by working on other things. That means this week's patch is a bit lighter than the previous ones.

.NET 10 released this week, we'll be updating staging to use it later today, please give it a go, developers you'll need Visual Studio 2026 or your favourite code editor with .NET SDK 10.

ByteStream Optimizationby garry

ByteStream is the foundation of our network system, and a few other systems. It's used to basically read and write raw data to byte memory, to send and receive over the network.

I noticed that in a few places we had started using a pooled MemoryStream because ByteStream was apparently too slow. This hurt my feelings because I made ByteStream to be a faster, zero allocation alternative to MemoryStream and BinaryWriter/Reader.

So I spent some time speeding it up. It's now on average 5x to 50x faster than it was.

Allocationsby garry

I added this graph to the public metrics showing what we're allocating most.
Screenshot 2025-11-12 at 11.37.43.png 500.62 KB

Inline Editor: copy, paste, resetby Layla

You can copy, paste and reset on inline editors now as expected
511665932-de30645b-117c-4070-8d29-391ea68cf0c3.mp4 398.44 KB

CommandList optimizationsby garry

The CommandList was added a while back, and is used to build up render commands that execute on the render thread. We don't want people running code on the render threads - because it causes all kinds of hurt.

I'd coded this in a lazy way because it was a proof of concept. So it wasn't that optimal. It was allocating a lot.

We are using it more now, and plan to use it a lot more in the future - so I changed how it works internally to be pretty much allocation free.

Time Weirdnessby garry

There was a lot of weirdness happening with the Time variables, causing what felt like stuttering & irresponsiveness.
20100Aa1-429B-46B1-A5a1-Bcb8a30246e2.mp4 27.47 MB
I fixed time being 1 frame too old in Update() as well as cleaning up FixedUpdate() lerping.