2,117 Commits over 549 Days - 0.16cph!
Merge: from useplayertasks_invisplayers
- Bugfix for invisible player in helis/other vehicles with UsePlayerUpdateJobs 2
Tests: 2p on Craggy, flew heli to player outside of network range 5 times - player was visible
Bugfix: UsePlayerUpdateJobs 2 - when player leaves occlusion group, clean up last visibility timestamps
- fixed whitespacing after merging messing it up in one of the files
This caused negative feedback loop. If EntityQueue doesn't send snapshot during network subscription change (because of OcclusionFrameCache), the ServerOcclusion should send it, but having an expired visibility timestamp meant it didn't send the snapshot (expired == previously visible, so snapshot already sent).
Tests: on Craggy with UsePlayerUpdateJobs 2 flew 2 players outside of network range, then made 2nd player fly in a minicopter to the 1st - was visible. Repeated this flight test 5 times - all passed.
▅▉▆▍█▄▄▊: ▇▇▋▊▉▉▄ ▊▍▉ ▅▌▍ ▇▋▊▍█▉▆▅ ▊█▍▉ ▍▅▅█ ▌▊▆█▇▅▋▉ ▋▄█ ▄▆▅▉█▍█
▌▋▊▄▄█▌█▊▌▌ ▄▉█▌▅▅▌▍█ ▊▅▄ ▄▆█▅▆▍█ ▍█ ▊▉▆▇▌ ▋▊▌ ▊▌▉▍▋ ▊█▄▅ ▅▍ - ▋▉ ▉▋▋▋▉ ▋▊▆▊▉▅▍██▍▅█▇▇ ▅▄ ▌▋ ▉▅▇▉ ▍▄ ▄▋█▆▌▄▋ ▉▊▆▄▄▉
▄▆▇▍▆: ▆▉▌▋▌ ▊▉█▊▍▅▊ ▆▆▊▅▉▋ ▊▋▉▇▅▊▌
Merge: from triggerparentdelayedexit_optim
- Optim: new TriggerParent volume processing mode, controlled by TriggerParent.TickMode (default to 1, old mode is 0). TickMode 1-specific optims controlled by UsePlayerV2Shortcuts and AllowTriggerSleeping switches (both enabled by default)
Tests: built boats, sank them while on them, spawned 100 boats with sleepers both with TickMode 0 and 1
Update: set TriggerParent.TickMode to 1 by default
- codegen
Tests: booted up craggy in editor, checked that it's set to 1 and called at boot
Merge: from main
Tests: compiles
Merge: from main
Tests: compiles
Clean: remove TriggerParentDelayedExit.allow_tick_skipping support
- codegen
Originally was an optim, but discovered that I had a bug that always stayed disabled. If we need it, I'll reimplement it for TickMode 1
Tests: compiles
Update: Tickmode 1 - add allowtriggersleeping optim killswitch
- codegen
Tests: built a boat, set tickmode 1, checked in profiler what runs. set AllowTriggerSleeping 0, checked profiler - it started running queries
Optim: TickMode 1 - allow triggers to sleep if they don't move on specific axis and internal entities also don't move on specific axis
- took out internals of BaseEntity.HasMovedInLS to BaseEntity.ComparePos(Vec3 from, to)
- Player Boats now set interest in XZ when alive, XYZ when sinking
- Buildfix for SERVER only code (whoops)
This brings 100 boat test to 0.25ms (down from 1.6ms, -85%), or down from 3.1ms, -92% from TickMode 0
Tests: built a boat, set tickmode 1, jumped on and off - got unparented. turned on the engine, jumped off - got unparented once in the water. noclipped above with engine on - got unparented after a delay. Spawned 100 boats.
Update: BaseEntity now remember it's last LS position and can report on which axis it has moved
- added unit test for it
Needed for upcoming parent trigger optim
Tests: ran unit test
Optim: reduce branching in BaseEntity.HasEntityInParents
Saves a tiny amount (60micros for 600 checks), but the change is relatively trivial and is used in a bunch of places
Tests: spawned 100 boats with 3 sleepers
▇▍▇▋▆: ▇▉▌█▅▉▍▌▅▍ - ▅▌▌▍ ▅▆▍▅▆▄ ▆▊▊▌▆▆▄▍ ▅▋▋▉▆▊ ▊▆▊▋ ▍▌▋ ▇█▅▋ ▋▉ ▆▊▋▇▋▅▋
▄▊▍▍ ▆▍▉▍▊█ ▅▉▉▆▆▌▊▅▆ ▇.▆▍▆(█▅█ ▊▌▇▇▇▄█▉ ▊)/▍.▇▋▉(▍▆▋ ▊▄▄▆▅▇▍▋ ▅) ▅█ ▋█▄██▌▋▆▊▊
▆▄▄▄▄: ▊▆▉▌▊ ▆ ▄█▆▅ █▌▇ ▇▍▉▆ ▅▉ ▋▄▉▉ - ▌▌▌ ▊▊ ▅▇▍▍▆▅▊ ▊▆▆▉▆▊▍▌▆▄
Optim: TriggreParent.TickMode 1 - batch swimming checks
100 boats now take 1.6ms max (down from previous 2.1ms, -24%) vs 3.1ms (-49%) of TickMode 0.
Tests: built a boat, sank it by shooting, got unparented
Update: expose StableObjectCache internal T[]
- had to introduce approx equals to WaterInfo as unit tests were failing (why now?)
- consolidated common logic to fix missing shoreline check in batched version (we need unit tests as part of builds)
Need it to simplify code around water factor batching
Tests: unit tests
Update: adding a TODO to enable minor logic caching
Tests: none, trivial change
Merge: from triggerparentdelayedexit_optim
- Bugfix: added missing check in tickmode 1
- Bugfix: fixed TriggerParentDelayedExit cleanup logic disabling it's effects
- New: paste_line command
Tests: built a wonky ship with tickmode 1, jumped over it's gaps
Update: TriggerParentDelayedExit cleanup logic only runs when trigger is disabled
We always ran cleanup when OnEmpty got invoked, even if decided to delay the exit, which disabled delay functionality
Tests: built a wonky ship and jumped around gaps - parenting was in effect long enough
Bugfix: TickMode 1 - add missing overrideOtherTriggers check
Tests: none, trivial change
Update: remove dead vars and cache == null check
Tests: none, trivial change
Update: add paste_line <name> [count = 1] [offset = 1] - will spawn the clipboard in a line using player's facing with offset-sized spacing
- also if pasting players, make sure they run their ForceTriggerUpdate
- codegen
Tests: spawned a 100 boats in a line
Bugfix: TriggerParentDelayedExit::SupportsTickSkipping was always evaluating to false
- switched it to be off by default, as it was likely off during my earlier testing
Tests: none, trivial change
Merge: from triggerparentdelayedexit_teleport_fix
- Bugfix: teleporting from a player boat should no longer cause weird parenting issues
Tests: built a boat, teleported away - no weird movement afterwards
Bugfix: don't try to delay unparenting when teleporting away from the boat
Tests: built a small boat, spawned a player on it, turned on the engine, teleported away - didn't have the weird extra movement
Merge: from analytics_std_dev_fix
- Bugfix: fix for invalid std_dev calculation
Tests: none, trivial change
Update: always record high and low percentile telemetry for non-game mode
It's a smidge more data, but makes building dashboards easier
Tests: none, trivial change
Bugfix: fix std_dev that could generate NaNs via sqrt of a negative number
Tests: none, trivial change
Merge: from triggerparentdelayedexit_optim
- Bugfix: shooting a weapon can cause NREs on the client
Tests: shot in the sky with a bunch of bursts - no NREs
Bugfix: VerifyRays - avoid trying to read hit array outside of working area
I asssumed we always call it with tightly-sized arrays, but it's not the case on client
Tests: shot in the sky with a couple bursts - no NREs
Merge: from triggerparentdelayedexit_optim
- Optim: improve performance of GamePhysics.TraceRays family of queries
- Optim: TickMode 1 - add UsePlayerUpdateJobs2 related shortcuts to TriggerParent
Tests: built a boat with tickmode 1, spawned npc player on it, jumped on and off, flew in it's vicinity - no issues.
Optim: TraceRaysUnordered - optimize collider validation using burst jobs
- added UtilityJobs.FlipBoolJob and ScatterToJob<T>
This brings costs down across the board:
* 128 rays - 0.37ms -> 0.25ms, 33% improvement (serial was 0.49ms, 49%)
* 1k rays - 2.59ms -> 1ms, 61% (serial was 4.33ms, 77%)
* 8k rays - 18.9ms -> 6.26ms, 67% (serial was 34.79ms, 82%)
Tests: unit tests
Optim: TraceRaysUnordered - run water traces in parallel to raycasts
Not the best impl, but shows improvement for smaller ray counts (where we're not dominated by Verify):
* TraceRaysUnordered - 128rays: 0.44ms -> 0.37ms, 1k+ rays same
* TraceRays - 128rays: 0.56ms -> 0.50ms, 1k+ rays same
Can apply the same to sphere casts as well.
Tests: unit tests
Optim: TriggerParent.TickMode 1 - use cached water and ladder results in UsePlayerUpdateJobs 2 env
- codegen
This should allow us to skip ~30% of the overall runtime. Can be disabled via TriggerParent.UsePlayerV2Shortcuts 0 (defaults to 1)
Tests: none, will check tomorrow once brain is fresh
Optim: TriggerParent.TickMode 1 - avoid unnecessary entity lookups in RunClippingChecks
Microoptim, but why not
Tests: none, trivial change
Optim: TriggerParent.TickMode 1 - skip RunClippingChecks for entities that failed RunCheckForObjUnderFeet
Tests: none, trivial change
Clean: remove a couple TODOs
Was worried about a bug, but deeper scrutiny think the code is correct
Tests: none, trivial change
Clean: refactor TriggerParent.ShouldParentEntitiesJobs
- Added profiling scopes
No functional changes. This makes data flow easier to track and manage, and helps visualizing stages in perf snapshots.
Tests: built a long-boat in tickmode 1, spawend 6 players on it, went to edit mode and back, jumped on-and-off as it was moving
Bugfix: Add missing Native collection disposal in GamePhysics
Audited all of GamePhysics, looks to be the only cases that slipped in
Tests: unit tests + built a boat with tickmode 1
Optim: use persistent buffers for TriggerParent::RunCustomJobsQueue
- codegen
Tests: with tickmode 1 - built a boat, jumped on-off
Clean: rip out tickmode 1 and 2, rename Jobs mode as tickmode 1
- codegen
Out of all versions it's fastest, so only going to continue with it vs baseline 0
Tests: compiles
Merge: from triggerparentdelayedexit_optim
- Bugfix: properly cleanup TriggerParent and TriggerParentDelayedExit to avoid invalid invokes running
Tests: built & finished a boat, jumped around while moving, put it into edit, finished, jumped around - no errors, no extra invokes
Bugfix: properly clean-up TriggerParent and TriggerParentDelayedExit when it gets disabled
Reimplements intents of `139965`.
Tests: built & finished a boat, jumped around while moving, put it into edit, finished, jumped around - no errors, no extra invokes
Merge: from triggerparentdelayedexit_optim
- Bugfix: mitigate double trigger exit call on TriggerParent
- Bugfix: TriggerParentDelayedExit leaving invalid invokes when editing already existing boat
Tests: built a boat, spawned a player on it, edited - no more errors, no extra invokes running
Undo of Undo:
139927 (merge: from triggerparentdelayedexit_optim)
Will apply the fixes on top with merge
Bugfix: TriggerParentDelayedExit - skip entity-delay logic when trigger gets disabled
This left invalid invokes running when editing existing player boat, inflating the perf cost
Tests: edited existing boat, checked profiler - saw no perf samples gor persistent queue