916 Commits over 243 Days - 0.16cph!
New: TickInterpolatorCache - a sparse, bulk TickInterpolator array
- Comes with it's own stress tests (they pass, but need to investigate perf)
- Depends on PlayerCache, but I need to modify it to provide more stability
Building block towards jobifying tick history processing.
Tests: ran unit tests
Optim: replace couple managed loops with a burst job
Tests: none, trivial changes
Merge: from parallel_validatemove
- buidlfix
Tests: build client and server in editor
Buildfix: move ValidateTransformCache to SERVER region
- also fixed missing Profiler.EndSample()
Tests: built client and server in editor
Merge: from parallel_validatemove
- Adds error checking to UsePlayerUpdateJobs 1 mode and graceful disable to avoid crashes to help with investigation
Tests: ran parallel mode in editor on craggy with a couple debugger-forced emergencies
Merge: from main
Tests: none, trivial merge
Clean: promote server var to a const
- no codegen since I didn't do one when I added this
It's temp code, but it makes things safer while I investigate, so no reason to disable it at runtime
Tests: none, trivial change
Bugfix: purge player cache when player update jobs has emergency shutdown
Allows to restart player update jobs cleanly in the same session
Tests: in editor with debugger forced an emergency scenario, confirmed the cache was empty and rebuilt
Update: move player transform cache updates to be first step of parallel player processing
- Bugfix - using Steam networking backend can have temporary outtages, which can cause gaps in processing and player cache desyncing
- also enables us to compose parallel flows better in the future
Tests: local editor session on craggy
Update: add temp emergency disable of player job processing
- Only active on staging servers while I investigate the crashes
Tests: forced an error via debugger - confirmed fallback is working
Tests: move the PlayerCache stress test to it's relvant tests file and clean up
- commented out the expected-to-fail case
Tests: ran the tests
Update: adding throw away tests to investigate how I cuased a native crash yesterday
So far everything points to BasePlayer being removed after we cache all transforms for the burst jobs and before the first RecacheTransform invoke, but I haven't tracked where it's coming from.
Tests: ran the hacky unit test
Merge: from players_cmd_clean
- Removes obsolete columns
Tests: ran the command in a local editor session
Buildfix: restore server ifdefs
Tests: compiled in editor
Clean: remove obsolete columns from players cmd
- Also rewrote it using the new API
Tests: ran in a local session in editor, tested both text and json versions
Merge: from profiling_improvements
Tests: took a snapshot in editor
Update: updated profiler binaries
- Built from 7b1b923e
Contains additional filters for BaseNetwork::ShouldNetworkTo, BaseEntity::ShouldNetworkTo and entire Facepunch.Network.Subscriber class
Tests: took a snapshot in editor
Merge: from minigun_audio_fix
- Fixes minigun audio beign stuck on Client after releasing the fire button
- Fixes minigun effects not replicating to other players
Tests: local 2 player session with each player firing minigun in various patterns.
▍██▄▆▋: ▊█▇ ▋▆█▊▋▇▋ ▄▍▋▌▉ ▋▇▉▋▅ ▍▆▋ ▌▇▆ █▍▌▉▆▉▍▄▆▍▄ ▌▍▅▋
- ▍▆▌▇▋█▍ ▋▆▄▍▆▅ ▋▇▋█▇▄ ▍▋ ▌▌██ ▄▋ ▊▊▋▉▊▉ █▄▍▌▉▉, ▋█▆▊▉ ▇▇▋▆▌▆-▊█▍▅ ▄▅█▇▍▋▊ ▇▄▉ █▇▋▊▊▇▌▍ ▋▆█ █▆ ▇▅▅ ▆█▌█▅▅
▋▇█▍▉: █▊▋▄▅ ▅ ▅▄▄▉▅▊ █▇▊▋▊▋▉ ▌▄▆▌ ▉▆▉▊ █▇▊▇▆▋ ▌█▇▍▅▇ ▇▅▆▅▉▅▌ ▇▄ █▇▄▊▌▄█ ▆▋▆▌▊▉▋▋.
Merge: from item_allocs
- Simplifies stacking logic to be cheaper and get rid of potential allocation
Tests: various stacking scenarios from belt to inventory with wood stacks(incomplete stacks, full stack + incomplete, full stack only)
Merge: from main
Tests: none, no conflcits
Optim: don't sort items when trying to stack them
This saves us the potential allocation in Sort + less iterations over the array + can avoid doing slightly more expensive logic if we randomly jump around in item container.
Tests: various stacking scenarios from belt to inventory with wood stacks(incomplete stacks, full stack + incomplete, full stack only)
Merge: from item_allocs
- Fixes BufferList not able to sort when it's not full
- removes some from Item.MoveToContainer
Tests: moved and stacked items in the inventory while checking profiler
Optim: remove allocations from Item.MoveToContainer
Unity profiling showed an allocation inside it's sort impl, but I haven't seen it on server snapshots - will clean up if it is there
Tests: got a bunch of wood in separate stacks and stacked it via right click from belt to inv. Checked profiler to confirm expected allocations are gone.
Bugfix: BufferList can handle sorting subrange
Tests: moved items around in inventory(future cl)
Merge: from growablegenes_allocs
- Remove allocs from GrowableGenes
Tests: local in editor, spawned a planter box, filled it with seeds while monitoring Profiler stream
Clean: remove profiling hack
Tests: none, trivial change
Update: avoid linq allocations in GrowableGenes
Tests: local in editor, spawned a planter box, filled it with seeds while monitoring Profiler stream
Merge: from treemanager_oob_nre
- Fixes NRE caused by trees close to the edge of the world
Tests: throw away unit tests that sampled edges of the tree manager's grid
Bugfix: Properly calculate grid dimensions for TreeManager
Fixes NRE caused by trees close to/outside of world bounds (modded)
Tests: throw away unit tests that sampled edge locations
Merge: from active_tooltip_nre
Logs to help track down mystery NREs.
Tests: booted into bootstrap scene
Update: reinforce Tooltip language changing logic
Instead of throwing an NRE report an error. I don't see how we can end up in this situation, but our logs show it can rarely happen.
Tests: booted into bootstrap scene
Merge: from baseplayer_dispose
- Fixes the error log spam on staging
Tests: local 2 player session, 2nd player disconnected, triggered GC - no errors
█▄▅▉▌▅: ▊▊▌▇▌█▅▅▊▍ ▋▄▆ ▋▆▋▋█▅██ ▉▉▇▌▉▍▇▋▅▄▊▆ ▆▋ ▅█▌▇▋█ ▇▌▌▄ ▊▆ ▊▌▋▆
▊▇█▋▄ ▅█▉ ▇█▌▇█ ▍▅▋▄
▄▅▆▍▄: █▍▅▊▋ ▇ ▅▆▇█▄▌ ▇▆▌▉▊▄▍, ▇▄▇ ▊▍█▍▍▍ ▆▊▋█▇▊▍█▉█▇▅, ▇▅▄▇▆▉▉▌▌ █▇ - ▄▆ ▊▍▄▇▅▆
Merge: from parellel_validatemove
- Full conversion of player WaterInfo caching over to jobs
- TerrainMap now uses NativeArray instead of managed array
- expanded unit tests
- new ServerDemoProcessor that tracks water results checks (in/out of water counts)
Going to start testing on staging and monitoring the impact
Tests: ran all the new or updated unit tests, made sure builds passed locally, during dev used server demos to validate stats.
Clean: remove unnecessary usings
Tests: editor compiles in CLIENT+SERVER
Update: adding missing logic to BasePlayer.ServerUpdateParallel since the merge
- also fixed the formatting in a couple places
Tests: none, trivial changes
Bugfix: check if ignore grids (terrain, water) are present
- Covers cases in editor where they haven't been setup yet
Tests: ran unit tests
Bugfix: invalid indexing of water infos when player is parented to a water blocking entity
Tests: none, trivial change
Merge: from main
Tests: ran unit tests, played in editor with parallel update jobs enabled on Craggy - water was detected correctly
Bugfix: rename WaterVisibilityTrigger.Reset to ResetTrackedTriggers
Old name conflicted with Unity's scripting api and generated errors in editor(problematic for tests)
Tests: ran unit tests
Bugfix: fix GamePhysics batched queries bugs
- Was incorrectly indexing the array of results
- GetIgnore(Vec3, float) was using a swept sphere instead of sphere overlap (like original code)
Tests: ran unit tests - they now pass
Tests: Add missing layer for WaterVisibilityTrigger objects in WaterLevel tests
This now stressed the execution path for the submerged head in GetWaterInfo and shows I have a divergence. Will fix shortly.
Tests: ran all tests
Update: making PlayerCache a server-only utility
- Made some tests server only
It's an intrusive collection (requires an int field on BasePlayer), and we only add it for server version of player. For now there's no need to generalize it anyway.
Tests: compiled in editor
Bugfix: fix invalid index scrambling logic in tests
Turns out the tests were borked and generated duplicate indices, which is not something that batch logic can handle.
Tests: ran all unit tests
Bugfix: avoid trampling results when scattering out physics query results
- Also reduced size of temp allocations (they're still there, but it's the slow path anyway)
This is not the bug spotted by tests, but it would bite us in the back anyway.
Tests: none, as neither the demo nor tests cover this path (NYI)
Update: generate a sample grid for water tests & use WaterVisibilityTrigger
This stress tests a rare execution path. It revealed a divergence between serial and batched - will fix next
Tests: ran unit tests
Merge: from texttable_allocs
- Layout improvements and NRE fix for 0 rows
Tests: unit tests + running filtered status command to force 0 rows