2,859 Commits over 730 Days - 0.16cph!
Merge: from furniture_occlusion_fix
- Reimplement previous bugfix to retain furniture culling
Tests: rendeted and tried to run in and out, abused noclip, triggered bug once
Bugfix: restore furniture occlusion culling, check both occlusion state and appt flag
Tests: rented 601, ran in and out, noclipped a bunch - was able to trigger it only once(abusing noclip) instead of constantly, should be better
Merge: from renderbatch_meshlod_improv
- Bugfix for basement doors not rendering
Tests: booted into apartments island, checked all floors for doors not rendering. Checked room 101 - stuff was rendering
Bugfix: mark appartment doors a/b/c as dynamic
- apartments S2P
Since they move, they should've been dynamic, but it also causes them to be refreshed and have up to date occlusion state (but no idea why we need this - will chase up later)
Tests: booted into apartments island, checked all floors for doors not rendering. Checekd room 101 - stuff was rendering
Update: add visible count to occlusion debug output
Tests: used it on craggy while tweaking extra lod steps
Merge: from renderbatch_meshlod_improv
- Bugfix: opening doors should no longer cause them/others to disappear
Tests: pasted many doors paste and opened door, flew back and to - all was in place
Bugfix: fix MeshLOD never unregistering from occlusion after animating
- when batching gets toggled, notify batching handlers
- MeshLOD will toggle culling on notif
Tests: paste of many doors, opened couple doors and flew far/close - no more missing meshes
Bugfix(editor): add ResetStaticFields to OcclusionCulling
- codegen
Tests: spawned copypaste, restarted game in editor - print out doesn't mention lingering renderers
Update: add ability to step through higher levels of mip chain to reconfirm visibility
- controlled via culling.extralodsteps, default to 0 (same as before)
Out HiZ downsampling filter erodes depth at edges of objects, so if objects picks a low mip, there's a good chance it won't see any occluding depth
Tests: ran around apartments monument in editor with 0, 2 and 7. at 2 saved only 0.25% percent of drawcalls, but 7 can save up to 10% (will profile standalone later)
Update: draw picked hiz lod for occludees in occlusion debug
Tests: used debug visualization in editor
Bugfix: add using on actionResult to avoid leaking
Tests: none, trivial change
Merge: from jobs3_as_default
- Update: UsePlayerJobs is set to 3 by default
Tests: booted craggy and verified server var
Update: default UsePlayerUpdateJobs to 3
- codegen
Tests: booted craggy, console returned 3
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