2,840 Commits over 700 Days - 0.17cph!
Merge: from renderbatch_meshlod_improv
- Optim: allow culling to work on MeshLods if they have invalid RenderBatch setups
- Optim: Avoid creating batches-of-1-mesh, as that inhibits Unity batching
Tests: ran around apartment complex, didn't see rendering artifacts. compared standalone builds, shows 20% fps improvement on my setup
Clean: add a comment
Tests: none, trivial change
Optim: permit MeshLods to use occlusion culling if it has an invalid RendererBatch
Taken from
156029. Saves 30% of drawcalls in all 5 test cases, 20% of avg fps improvement in editor(will test standalone later)
Tests: profiled 5 test cases, flew around keeping an eye out on weird rendering
Optim: don't create procedural batch meshes if they only contain one input mesh
This inhibits unity's batching via instancing. In 2 out of 5 scenarios saves 16% of draw calls/~1ms avg in editor
Tests: monument island with appts and disabled world prefabs, tleeported to 5 locations and inspected profiler stats
Clean(editor): get rid of if bypass for drawing LightOccludee gizmos
Optim: LightOccludee - use a smaller occlusion sphere for spotlights with angle < 120deg
- updated editor gizmo vizualization to run without starting (still needs sticky gizmos)
Tests: booted on appt, went to roof and looked up, penthouse appt lights were culled. Ran around - everything looked okay, no popin
Update(editor): change window title label for MotionVectorsChecker
Tests: none, trivial change
New(editor): MotionVectorsChecker - categorizes all renderers by motion vector mode
Can be found at "Tools/Find/List Motion Vector generators"
Tests: looked at appt monument - almost everything has per-object mode
New(editor): CulledMeshesChecker - finds all meshes without some sort of culling setup
Can be found in "Tools/Find/Meshes without Occlusion setups".
Tests: ran the tool on appt monument, found ~360 issues
New(editor): CulledLightsChecker, reports lights that don't have a culling setup
Inspired by ShadowProxyChecker. Can be found in Tools/Find/Lights without Occlusion setups.
Tests: Used it to inspect the appt scene
Merge: from unity_frame_dump
- New(editor): frame debugger dump utility(https://github.com/sputnicyoji/unity-frame-dump) to help analyze what is rendered
Tests: used it to dump out a couple passes
Update(editor): move the exporter to Window/Analysis
We've got too much in Tools
Tests: editor compiles
New(editor): import and change https://github.com/sputnicyoji/unity-frame-dump
- Changed full export to run on the provided user range
- added stop full export that still emits the resulting json instead of aborting
- Added license
Tests: exported a frame from standalone client
Buildfix: expose NetworkPosTickCallback setter
Tests: none, trivial change
Merge: from cargoship_bot_replication_fix
- Buildfix: expose setter for NetworkPosTickCallback
Tests: editor compiles
Merge: from cargoship_bot_replication_fix
- Bugfix: fix bots/sleepers disappearing from cargoship
Tests: spawned cargoship event, spawned bot, followed them for a couple mins - no houdini
Bugfix: ensure netgroup of sleepers/bots is updated when parented to a moving global entity
Tests: spawned cargo ship, spawned a bot and moved through net grid for a minute - bot didn't disappear
Merge: from dropspectators_nre_fix
- Bugfix: fix for NRE that happens when multiple spectators watch a player being banned
Tests: 2 players spectated 3rd, banned them - no NRE
Bugfix: use reverse traversal avoid NRE caused by iterator invalidation when dropping spectators
Tests: 2p spectated 3rd, banned them - no more NRE
Merge: from alloc_clean_july2026
- Optim: avoid ~15 separate allocations related to scheduling/cancelling invokes
Tests: none, trivial changes
Optim: cache FogMachine invokes
- StartFogging, EnableFogFieldCB, DisableNozzleCB, FinishFoggingCB
There were invoked in StartFogging, which can oscilate with power.
Tests: none, trivial changes
Optim: skip BeeSwarmMaster.StartDie call if already dying
Saves on ActuallyDie invoke and allocation
Tests: none, trivial change
Optim: avoid repeated invoke scheduling in BeeSwarmAI
- SetOnFire gets skipped if bees are already on fire (saves StartDie scheduling)
- StartDie gets skipped if bees are already dying (saves Egress scheduling)
Tests: none, trivial changes
Bugfix: fix caching of DiveSiteBuoy.updateAction
Tests: checked IL
Optim: cache Sprinkler.DoSplash invoke
Tests: none, trivial change
Optim: cache HBHFSensor.UpdatePassthroughAmount invoke
Tests: none, trivial change
Optim: cache ElectricBattery.TickUsage invoke
Tests: none, trivial change
Optim: cache ElectricBattery.AddCharge invoke
Tests: none, trivial change
Optim: cache CoalingTower.CheckWagonLinedUp invoke
Tests: none, trivial change
Optim: Cache StrobeLight.SelfDamage invoke
Tests: none, trivial change
Optim: cache SamSite.WeaponTick invoke
Tests: none, trivial change
Merge: from fullserverdemo_removal
- Clean: Remove FullServerDemo implementation (RustRelay will take us to the promised land)
Tests: compiles, recorded client and server demos and was able to play them back
Clean: get rid of Network.ServerInfo
Was added for FullServerDemo support, no longer needed
Tests: compiles
Clean(editor): rip out DemoSever framework
It could technically emulate server state from client demos, but required too much compromising, so not worth it.
Tests: compiles
Clean: delete Demos folder from Facepunch.Network
Tests: compiles
Clean: delete full-server-demo convars
Tests: compiles
Clean: remove IServerCallback save request support
Keeping the core functionality on SaveRestore
Tests: compiles
Clean: remove FullServerDemos.cs
Tests: compiles
Clean: remove BaseNetwork.SupportsServerDemos
Tests: compiles
Clean: remove demo.full_server_demo
- rip out a bunch of stuff related to it, including transient entity serialization
- remove MessageType.DemoDisconnect and DemoTransientEntities (no need for protocol change)
Tests: compiles
Clean(editor): remove ServerDemoPlayer
Tests: compiles
Clean: remove AntiHackDemoProcessor
- drive by deprecated API fixup
Starting process of removing full server demos
Tests: compiles
Resave TimeManager
Tests: nothing specific, but have been running with this changed for a couple days
Merge: from waterlevel_deepsea_sample_fix
- Bugfix for water level queries incorrectly mixing deep sea and overworld states
- Bugfix for deep sea ocean sim using overworld heightmap
- Simplified TerrainHeightMap API
Tests: ran unit tests, booted into craggy, explored deep sea and swam around
Bugfix: avoid NRE when ocean sim is not initialized and we don't need it
Tests: booted into craggy
Clean: simplifyy WaterSystemBurst.GetHeightArray_Burst
Tests: none, trivial changes
Clean: minor adjustments to WaterLevel.GetWaterLevels impl
- use FillJobIndirect instead of FillJob when waves are not needed
- get rid of namespace qualifier
Tests: ran unit tests